[MSSQL] Verständnisfrage und Angst... :)

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • [MSSQL] Verständnisfrage und Angst... :)

    Hallo alle zusammen,

    Ich arbeite nun schon eine Ewigkeit an meinem eigenen kleinen System und seit dem ich dieses auch mal auf meiner 1&1 Domain laufen habe, ist mir etwas aufgefallen..... daher eine grundsatzfrage zur Verwendung von MySQL.

    Wie muss ich es genau verwenden?

    Ich habe seit Anfang an eine eigene Klasse, die ich dafür verwendet.
    Brauche ich eine DB Abfrage, so erzeuge ich mir ein Object.... dieses stellt die DB Verbindung her.... führt den Query aus und schließt direkt danach die DB wieder. Somit kann ich schön sauber die Daten wie ich sie brauche aus meinem Object holen.

    oder muss man es doch so machen:

    DB Connect herstellen
    ...
    ... Seite abarbeiten...
    ...
    DB Connect schließen

    Ich muss dazu sagen... mein gesamtes System basiert förmlich auf meiner Klasse und nutzt an allen Ecken und Enden diese Objekte.
    Mir ist nun aufgefallen, dass mein System auf meinem 1&1 Server öfter mal keine DB Verbindung aufbauen kann und somit natürlich nichts mehr geht und ich die Seite manchmal sogar mehrfach aktualisieren muss.

    Bitte sagt mir, dass ich bisher korrekt gearbeitet habe .... ansonsten kann ich mein System zum Teufel schicken glaube ich, wenn das bei anderen Servern auch so krass ist.
    Ich hab die längste Zeit lokal gearbeitet und hatte somit nie Schwierigkeiten mit den DB Verbindungen..... daher wundert mich das jetzt.

    Ich hoffe ihr könnt mir etwas positives dazu sagen.

    Gruß Mario

  • #2
    ich würde mal sagen auf dem prinzip basieren viele systeme. ohne code oder nähere infos kann man da wenig zu sagen
    it's not a bug,
    it's a feature!

    Kommentar


    • #3
      [MSSQL] DB

      Ja ... welches Prinzip wäre nun das korrekte? Das wäre auch meine eigentliche Frage dazu.

      Mache ich es richtig, so wie ich es bislang mache oder sollte man es so machen?

      DB Connect herstellen
      ...
      ... Seite abarbeiten...
      ...
      DB Connect schließen


      Ich arbeite hingegen bisher so, dass ich bei jeder DB Abfrage die Verbindung herstelle... die Daten aus der DB hole / oder schreibe und direkt danach die Verbindung wieder schließe.

      Dadurch habe ich gerade solche Bedenken.

      Gruß Mario

      Kommentar


      • #4
        Nein, du solltest die Verbindung offen halten. Selbst ganz am Ende des Scripts muss sie nicht geschlossen werden. Das macht PHP automatisch.
        Wirklich aktiv schließen muss man eine DB-Verbindung nur dann, wenn man weiß, dass der weitere Code noch sehr lange irgendwas macht, aber dabei die DB nicht mehr benutzt.

        Das Auf- und Abbauen der Verbindung kostet nur Zeit und bringt in Sachen Sicherheit überhaupt nichts.

        Kommentar


        • #5
          [MSSQL] DB Verbindung

          Okay... das ist eine Antwort.
          Auch wenn ich nun vor einem Problem stehe.

          Hättest du evtl. noch einen Tip, wie ich das ganze weiterhin über meine Klasse nutzen könnte? Kurz nochmal zum Verständnis, wie ich "bisher" gearbeitet habe.

          1. ich erzeuge mir ein DB Object
          2. Ich übergebe mein Query in das Object
          3. Ich führe das Query aus
          - hier baut der die Verbindung auf
          - führt das Query und evtl. noch ein paar kleine Dinge aus
          - DB Verbindung wird geschlossen

          4. Ich hole mir meine Daten wie ich sie brauche aus meiner Klasse.

          Da ich mich ja innerhalb eines Objects befinde, weiß ich nun gerade nicht wirklich, wie ich das mit der DB Verbindung so regeln kann, dass ich die DB Verbindung im Header meiner aktuellen Datei zwar herstelle und/aber dann dennoch mit meinen Objekten den Query ausführen lassen kann.... so, dass ich am Ende jeder Seite erst die verbindung wieder schließen brauche. ( auch wenns PHP selbst machen würde .. ich bin gern korrekt dabei hehe )
          Meine DB Klasse ist mir desshalb so wichtig, weil ich sie 1. natürlich mitterweile im gesamten System einsetze und 2. weil diese mir die geholten Daten schon aufbereitet, wie ich sie später weiter verwenden will/muss.
          Nur soweit ich weiß, hat man innerhalb eines Objects ja keinen Zugriff auf Variablen etc., die außerhalb dieser deklariert wurden.

          Gruß Mario
          Zuletzt geändert von GELight; 15.05.2008, 23:02.

          Kommentar


          • #6
            Du erzeugst ein Objekt am Anfang des Skripts. Im Konstruktor wird die Verbindung hergestellt und als Variable im Objekt gespeichert ($this->connection o.ä.). Die Query-Funktion greift dann auf die offene Verbindung wieder zu. Am Ende wird die Verbindung wieder geschlossen.

            Kommentar


            • #7
              hi,

              also ich öffne auch nur die verbindung, meist in einer config.php die in sowieso in jeder datei mit include/require hole .. und lasse diese verbindung einfach offen ... damit hatte ich bis jetzt die wenigsten problem.

              wenn du dich entschließen soltlest die verbindung offen zu lassen, erstelle dir eien datei .. binde sie mit include oder require ein und bearbeite die klasse so, das dort drinne KEINE verbindung mehr geöffnet und geschlossen wird.

              gruß
              uzu
              Gruß
              Uzu

              private Homepage

              Kommentar


              • #8
                [MSSQL] DB Verbindung

                @ pekka

                Genau so, wie du beschreibst, mache ich es ja auch bislang in meiner Klasse. Das heißt aber auch, dass die DB Verbindung nur innerhalb dieses Objects besteht.

                Ich müsste sie aber irgendwo außerhalb so deklarieren, dass ich dann mit meinen Objecten wieder Zugriff habe.

                @UzumakiNaruto

                Wie kann ich innerhalb meines Objects auf die verbindung zugreifen ( nutzen ) welche ich außerhalb erzeuge?

                Gruß Mario

                NACHTRAG:
                Ich hab eben einen Blitzgedanken gehabt, der für den heutigen Abend aber zu heftig ist zum durchdenken. Ich könnte ja mit Vererbung arbeiten oder spricht was dagegen?
                Ich erzeuge mit einer neuen Klasse nur die Verbindung und vererbe diese einfach an mein bisherigen DB Object( Klasse ) .... somit sollte das doch bestimmt irgendwie machbar sein... hehe
                Zuletzt geändert von GELight; 15.05.2008, 23:42.

                Kommentar


                • #9
                  Selbst ganz am Ende des Scripts muss sie nicht geschlossen werden. Das macht PHP automatisch.
                  ... und wenn irgendwann die PHP-Entwickler der Meinung sind, dass es sauber/sinvoller wäre, die Verbindung von PHP-Code schliessen zu lassen und nicht vom Parser, dann schmieren die Webserver nacheinander ab oder wie?

                  Ich schliesse jede DB-Verbindung sofort, wenn ich weiss, dass sie nicht mehr in weiteren Schritten benötigt wird, koste es was es wolle, aber das ist sauberer und sicherer. Wielange braucht das System, um eine Verbindung zu schliessen? So dass man darauf verzichten kann/muss?

                  Kommentar


                  • #10
                    Original geschrieben von asp2php
                    ... und wenn irgendwann die PHP-Entwickler der Meinung sind, dass es sauber/sinvoller wäre, die Verbindung von PHP-Code schliessen zu lassen und nicht vom Parser, dann schmieren die Webserver nacheinander ab oder wie?
                    Davon abgesehen, dass das ziemlicher Unsinn wäre und deshalb niemals so kommen wird, könnte man sich vorübergehend mit ini.auto_append_file bzw. ini.auto_prepend_file + register_shutdown_function() helfen.

                    @Topic: Stichworte Singleton, static.

                    Kommentar


                    • #11
                      Original geschrieben von onemorenerd
                      Davon abgesehen, dass das ziemlicher Unsinn wäre und deshalb niemals so kommen wird, könnte man sich vorübergehend mit ini.auto_append_file bzw. ini.auto_prepend_file + register_shutdown_function() helfen.

                      @Topic: Stichworte Singleton, static.
                      Warum ist das unsinnig ... Wenn du normale Application entwickelst, musst du spätestens beim Beenden des Programms alle Verbindungen schliessen, warum auch nicht bei WebApps? IMHO es gehört einfach zum guten, sauberen Programmierstil.

                      Kommentar


                      • #12
                        Das war wohl mißverständlich. Ich meinte es wäre unsinnig, wenn die PHP-Entwickler irgendwann beschließen würden, vom Programmierer das aktive Schließen aller offenen Verbindungen zu fordern.

                        Ein PHP-Script ist nun mal keine Applikation. Man muss sich um die Speicherallokation keine Gedanken machen und eben auch am Scriptende nicht aufräumen.
                        Ich finde es absolut "sauber" auf mysql_close() zu verzichten, wenn dazu schon im Manual steht "Using mysql_close() isn't usually necessary".

                        Kommentar


                        • #13
                          Re: [MSSQL] DB Verbindung

                          Original geschrieben von GELight


                          @UzumakiNaruto

                          Wie kann ich innerhalb meines Objects auf die verbindung zugreifen ( nutzen ) welche ich außerhalb erzeuge?
                          config.php
                          PHP-Code:
                          $conn mysql_connect($db_server$db_user$db_pass) or die ("Kommte den DB-Server nicht finden "mysql_error());
                                  
                          mysql_select_db($db_name$conn) or die("Konnte die Datenbank nicht finden "mysql_error()); 
                          script.php
                          PHP-Code:
                          include ("class.sql.php");
                          # object erzeugen
                          # sql statement abgeben .. OHNE identifier für die mysql-sitzung
                          # fertig 
                          class.sql.php
                          PHP-Code:
                          # functionen um den select abzugeben
                          # und weitere funktionen 
                          so in etwa könnte man dieses problem angehen

                          gruß
                          uzu
                          Gruß
                          Uzu

                          private Homepage

                          Kommentar


                          • #14
                            Original geschrieben von onemorenerd
                            Das war wohl mißverständlich. Ich meinte es wäre unsinnig, wenn die PHP-Entwickler irgendwann beschließen würden, vom Programmierer das aktive Schließen aller offenen Verbindungen zu fordern.
                            und genau da sehe ich nicht ein, dass es unsinnig wäre.
                            Ein PHP-Script ist nun mal keine Applikation. Man muss sich um die Speicherallokation keine Gedanken machen und eben auch am Scriptende nicht aufräumen.
                            es mag sein, aber es gehört nunmal dazu, sauber und konsequent aufzuräumen.
                            Ich finde es absolut "sauber" auf mysql_close() zu verzichten, wenn dazu schon im Manual steht "Using mysql_close() isn't usually necessary".
                            es steht z.Z. so drin, weil der Parser die Drecksarbeit für den Programmieren übernimmt, aber wenn mal ein Programmierer eine permanente Connection öffnet und vergisst sie zu schliessen, weil er schon immer "so" arbeitet, könnte's schon unangenehm werden.

                            Kommentar


                            • #15
                              Original geschrieben von asp2php
                              und genau da sehe ich nicht ein, dass es unsinnig wäre.
                              Es wäre Unsinn, weil die PHP-Entwickler damit vom Programmierer etwas erzwingen wollen würden, was die PHP-Umgebung gar nicht durchsetzen kann. Was soll sie denn machen, wenn ich so ein Script schreibe:

                              mysql_connect(...);
                              exit;

                              Der Parser kann das nicht abfangen. Das Script läuft also erstmal durch. Am Ende kann es mir einen Runtime Error hinterherwerfen. Wenn man den unterdrückt, macht es keinen Unterschied.
                              Anderes Beispiel: Ich habe eine Verbindung aufgebaut und irgendwo bricht mein Script ab (könnte auch user-abort sein).

                              mysql_connect(...);
                              raiseRuntimeError();

                              In diesem Fall muss die PHP-Umgebung sowieso das Cleanup übernehmen.
                              Wenn man all das (und noch mehr?) betrachtet, könnten die Entwickler uns nur dazu zwingen, wenn sie den Parser so umfrickeln, dass man in jedem Script eine Schutdown Function registriert, die auf jeden Fall mysql_close(), mssql_close() und alle anderen denkbaren Cleanup Methoden aufruft. Genau das macht der Interpreter zur Zeit selbst und dadurch ist es viel effizienter implementiert.

                              es mag sein, aber es gehört nunmal dazu, sauber und konsequent aufzuräumen.
                              FACK. Aber es gehört auch dazu, seine Umgebung zu kennen. Und die PHP-Umgebung bietet nun mal dieses "Feature" DB-Verbindungen zu schließen. Da gibt es also nichts aufzuräumen. Wenn du mysql_close() am Scriptende rufst, verbrätst du nur etwas Zeit für Function Call und Execution. Der Interpreter wird dennoch schauen, ob er noch Verbindungen schließen muss.

                              Wenn es ein malloc geben würde, man es aber nicht verwendet müsste, würdest du es tun? Ich nicht. Wenn die Umgebung etwas built-in mitbringt, verlasse ich mich darauf und freue mich über die so gewonnene Effizienz.

                              es steht z.Z. so drin, weil der Parser die Drecksarbeit für den Programmieren übernimmt, aber wenn mal ein Programmierer eine permanente Connection öffnet und vergisst sie zu schliessen, weil er schon immer "so" arbeitet, könnte's schon unangenehm werden.
                              Das ist etwas anderes. Wenn man mit persistenten DB-Verbindungen arbeitet, muss man sie bei Bedarf schließen. Das macht man allerdings dann sowieso nicht in jedem Script. Sonst bräuchte man ja keine Persistenz.

                              Kommentar

                              Lädt...
                              X