Melvin Cowznofski: Schließen einer Datenbankverbindung

Hallo,

laut dem PHP-Manual wird, wenn ich mittels PDO in einem PHP Script eine Verbindung zu einer MySQL Datenbank aufbaue, diese am Ende des Scripts automatisch geschlossen, wenn ich sie nicht davor "manuell" mit $db = NULL; trenne.

Meine Frage: Kann ich es mir somit sparen, die Verbindungen selbst zu beenden oder gilt das als schlechte Programmierung? Spricht etwas dagegen? (Ausser mein krankhafter Perfektionswahn!)

(Ich frage das deshalb, weil ich gestern in meiner Datenbankklasse eine neue, sehr umfangreiche Methode programmiert habe, die ihrerseits auf eine andere Methode zugreift, wobei ich in dieser anderen Methode die DB Verbindung selbst schließe. Damit die neue Funktion funktioniert, musste ich diesen Teil aber eliminieren.)

Mit lieben Grüßen

Melvin Cowznofski

--
Melvin Cowznofski What – me worry?
  1. Tach!

    laut dem PHP-Manual wird, wenn ich mittels PDO in einem PHP Script eine Verbindung zu einer MySQL Datenbank aufbaue, diese am Ende des Scripts automatisch geschlossen, wenn ich sie nicht davor "manuell" mit $db = NULL; trenne.

    Alles was du aufmachstm wird von PHP selbständig geschlossen. Das ist nicht auf MySQL-Vervindungen mit PDO begrenzt.

    Meine Frage: Kann ich es mir somit sparen, die Verbindungen selbst zu beenden oder gilt das als schlechte Programmierung? Spricht etwas dagegen? (Ausser mein krankhafter Perfektionswahn!)

    Schlecht ist das nur, wenn etwas sehr lange läuft. Das dürfte bei den meisten PHP-Scripten, vor allem denen im Webumfeld, nicht der Fall sein.

    (Ich frage das deshalb, weil ich gestern in meiner Datenbankklasse eine neue, sehr umfangreiche Methode programmiert habe, die ihrerseits auf eine andere Methode zugreift, wobei ich in dieser anderen Methode die DB Verbindung selbst schließe. Damit die neue Funktion funktioniert, musste ich diesen Teil aber eliminieren.)

    Das klingt nach schlechtem Stil, wenn die Methode alles selbst zu machen versucht. Beschränk dich in ihr auf ihre hauptsächliche Tätigkeit und lass alles andere andere machen. Ihre Aufgabe ist es anscheinend, bestimmte Daten zu holen. Dazu hat sie gewisse Voraussetzungen, die hereingereicht werden und vom Hereinreicher auch verwaltet werden sollten. Nur der kann wissen, was mit diesem Hereingereichten sonst noch so geschehen soll.

    dedlfix.

    1. Hallo dedlfix,

      danke für die Antwort! Nur Deinen letzten Absatz verstehe ich nicht so ganz. Was klingt da nach schlechtem Stil?

      Es handelt sich um eine Methode für das Abholen von Daten aus der DB, wobei im zurückgegebenen Array nicht nur die Ergebnisobjekte zu finden sind, sondern auch gleich alle Parameter, die ich für eine Blätterfunktion brauche. Dazu benötige ich vor der Datenausgabe ein internes Durchzählen der in Frage kommenden Datensätze und dies wird von einer eingebundenen COUNT-Methode bewerkstelligt.

      Mit lieben Grüßen

      Melvin Cowznofski

      --
      Melvin Cowznofski What – me worry?
      1. Tach!

        Nur Deinen letzten Absatz verstehe ich nicht so ganz. Was klingt da nach schlechtem Stil?

        Es handelt sich um eine Methode für das Abholen von Daten aus der DB, [...]

        Das kann sie ja machen. Das ist ihre Aufgabe. Ihre Aufgabe ist es aber nicht (auch noch), die Verbindung zum DBMS zu verwalten. Faustregel: Wenn du ein und in der Aufgabenbeschreibung brauchst, machst du zu viel an der Stelle. „Verbindung verwalten und Daten abfragen“ - Da ist also was zu viel.

        dedlfix.

        1. Hallo dedlfix,

          Das kann sie ja machen. Das ist ihre Aufgabe. Ihre Aufgabe ist es aber nicht (auch noch), die Verbindung zum DBMS zu verwalten. Faustregel: Wenn du ein und in der Aufgabenbeschreibung brauchst, machst du zu viel an der Stelle. „Verbindung verwalten und Daten abfragen“ - Da ist also was zu viel.

          Das ist ja auch nicht der Fall bei mir. Die Verbindung wird durch den Constructor und einen Singleton-Mechanismus hergestellt, also an ganz anderer Stelle! =)

          Mit lieben Grüßen

          Melvin Cowznofski

          --
          Melvin Cowznofski What – me worry?
        2. Es handelt sich um eine Methode für das Abholen von Daten aus der DB, [...]

          Das kann sie ja machen. Das ist ihre Aufgabe. Ihre Aufgabe ist es aber nicht (auch noch), die Verbindung zum DBMS zu verwalten. Faustregel: Wenn du ein und in der Aufgabenbeschreibung brauchst, machst du zu viel an der Stelle.

          Er sprach von zwei Methoden und davon abgesehen ist nichts dagegen einzuwenden, wenn eine Methode ihren eigenen Kram auch selbst aufräumt, ganz im Gegenteil.

          Nur, wenn dieser Kram auch woanders benötigt wird, wie in diesem Fall nach der Erweiterung wohl vorliegend, sollte die Verwaltung aus der Methode ausgelagert werden - und das hat er anscheinend gemacht, wie in seiner Eingangsfrage beschrieben.

          1. Tach!

            Er sprach von zwei Methoden und davon abgesehen ist nichts dagegen einzuwenden, wenn eine Methode ihren eigenen Kram auch selbst aufräumt, ganz im Gegenteil.

            Diese zwei Methoden, so habe ich seine Ausführungen interpretiert, fragen beide Daten ab. Die eine fängt an, delegiert eine Teilaufgabe zu einer anderen und will dann weitermachen. Dummerweise hat die andere Methode die Verbindung geschlossen. Die Verbindungsverwaltung soll nicht ihre Aufgabe sein, weil sie - wie in dem Fall sehr schön sichtbar wurde - gar nicht weiß, was mit der Verbindung noch geschehen soll. Deshalb soll die Verbindungsverwaltung aus den Methoden raus und in einem übergeordneten Kontext abgehandelt werden. Und das ist dann auch ganz unabhängig von der Frage, ob ein PHP-Script an seinem Lebensende von selbst aufräumt oder nicht.

            Die Verbindungsverwaltung ist also in deisem Fall nicht "ihr eigener Kram". Wohl aber wäre das ein Preäared Statement (wenn es da was aufzuräumen gäbe) oder eine Transaction, die sie vollständig selbst erledigen soll.Ist sie nur Teil oder kann aus anderen Gründen nicht wissen, dass sie Teil eienr Transaction is, dann ist es nicht ihre Aufgabe, die Transaction nach getaner Arbeit zu schließen.

            Nur, wenn dieser Kram auch woanders benötigt wird, wie in diesem Fall nach der Erweiterung wohl vorliegend, sollte die Verwaltung aus der Methode ausgelagert werden - und das hat er anscheinend gemacht, wie in seiner Eingangsfrage beschrieben.

            Wenn die Aufgabe klein und überschaubar ist, und vor allem unter allen Umständen atomar, dann spricht aus meine Augen auch nichts dageben, dass sie sämtlichen Kram allein macht und man nicht noch eine aufgeblähte Klasse drumherum schreibt. Doch irgendwann ist mit dieser Einfachheit Schluss und dann braucht man für komplexe Probleme eine ordentliche Aufgabenteilung. An dem Punkt ist der OP anscheinend grad angekommen und muss sich nun überlegen, wie er die Aufgaben zielführend teilt - und am Ende auch noch die Übersicht behält. Nicht umsonst haben sich anderenorts Muster à la Datenbankkontext, Repository, Service, Unit of Work, MVC und so weiter und so fort entwickelt. Nicht immer braucht man das volle Ballett, aber solche Aufgabentrennungen wurden ja auch nicht aus Langeweile erfunden.

            dedlfix.

  2. Hallo,

    (Ich frage das deshalb, weil ich gestern in meiner Datenbankklasse eine neue, sehr umfangreiche Methode programmiert habe,

    Also wenn Du schon mit eigenen Klassen operierst, dann guck bitte mal, ob du für solche Dingse nicht etwa den Destruktur sinnvoll einsetzen könntest.

    OO

    1. Tach!

      Also wenn Du schon mit eigenen Klassen operierst, dann guck bitte mal, ob du für solche Dingse nicht etwa den Destruktur sinnvoll einsetzen könntest.

      Die Frage ist dann, ob der Destruktor wirklich sinnvoll ist oder man nicht einfach am Script-Ende die Verbindung von PHP schließen lässt. Der Destruktor wird aufgerufen, wenn keine Referenzen mehr auf die Klasse verweisen. Er ist nur dann sinnvoll, wenn also die Referenzen (deutlich) vor Script-Ende aufgelöst werden. Wenn Referenzen bis zum oder kurz vor das Script-Ende bestehen bleiben, lohnt es sich auch nicht mehr und man kann PHP die Aufräumarbeit überlassen.

      dedlfix.

      1. Tach!

        Also wenn Du schon mit eigenen Klassen operierst, dann guck bitte mal, ob du für solche Dingse nicht etwa den Destruktur sinnvoll einsetzen könntest.

        Die Frage ist dann, ob der Destruktor wirklich sinnvoll ist oder man nicht einfach am Script-Ende die Verbindung von PHP schließen lässt.

        Es schafft klare Verhältnisse. Wer auch immer später mal reinguckt, sieht, dass die Verbindung zur DB nur innerhalb der Klasse zu Lebzeiten der Instanz verwendet wird. Das bedeutet, dass jede Instanz ihre eigene DBVerbindung hat.

        Es sei denn, die DBVerbindung steht in der Klassenhierarchie obendrüber oder ist persistent oder die DB-Klasse abstrahiert nur die Statements.

        Gute Nacht :)