MySQLi Verbindung: Static VS Object

TheGreenDragon

Erfahrenes Mitglied
Hallo,

hab zwar kein richtiges Problem, aber eure Meinung ist mir dennoch wichtig und zwar geht es um folgendes. Mein Klassendiagramm wird immer größer und meine Verbindungsanzahl zur Datenbank leider auch. Da ich eigentlich nur Objektorientiert programmiere, stelle ich mit der MySQLi-Schnittstelle immer wieder neue Objekte für einen Datenbankzugriff her. Soll man das so machen? Funktioniert zwar alles aber wenn ich überleg wie oft ein Verbindungsobjekt erstellt wird, wird mir schon komisch.
Oder spielt das alles keine Rolle da PHP schon weiß wenn wieder eine Verbindung mit genau diesem Host, User, Password, Datenbank erstellt wird dann gib ihm die letzte noch offene Ressource? k.a. ...

Eine andere Idee wäre die Verbindungsklasse statisch zu machen und nur mit einer Funktion getDBConnection() ein DB-Verbindung anzufordern. In dieser Funktion würde ich dann eine statische Klassenvariable auf Inhalt, Konnektivität, keine Ahnung auf was prüfen und bei Erfolg dieses zurückgeben oder aber eben eine neue Verbindung erstellen, dann der Klassenvariable übergeben und dann zurückgeben.

Was meint ihr? Wie geht man mit sowas am besten um?
 
Wenn du bei jeder Anfrage eine neue Verbindung aufbaust, ist deine Datenbankabstraktion falsch.

Das was du zuletzt beschreibst, ist ein Singleton Muster.

Die Alternative wäre ein Datenbankobjekt an jede Klasse weiter zu geben...

Und die letzte Alternative eine persistente Verbindung zu nutzen, die mysqli aber erst ab PHP 5.3 unterstützt.
 
Singleton Muster ist wie es aussieht das, was ich mit der statischen Definition meiner Klasse und Funktionen meinte, wenn ich das richtig verstanden habe.

Eine persistente Verbindung mit PHP 5.3 wird es wohl erstmal nicht geben da mir nur PHP 5.2 zum rumhantieren vorliegt.

Ich denke das weitergeben des Datenbankobjekt werde ich wohl praktizieren. Denn beim Singleton Muster glaube ich die Gefahr zu sehen das es bei sehr vielen Anfragen langsamer mit der Abarbeitung des Codes vonstatten geht. Oder sehe ich das falsch?
 
Zuletzt bearbeitet:
Hi,

ja ich denke, das siehst du falsch:

PHP:
class MyDBConnection
{
   private $dbcon;

   private static $_instance;

   private function __construct()
   {
       $this->dbcon = mysql_connect();
   }

   public static function query($query)
   {
       return mysql_query($query, self::getInstance()->dbcon);
   }

   public static function getInstance()
   {
       if( self::$_instance == null )
           self::$_instance = new MyDBConnection();

       return self::$_instance;
   }
}

MyDBConnection::query("SELECT * FROM foo");
MyDBConnection::query("DELETE FROM foo");

Beim ersten Aufruf von query() wird die Datenbankverbindung instanziiert. Beim zweiten mal schon nicht mehr. Der Constructor wird nicht mehr aufgerufen. Mit Hilfe des Singleton-Pattern kann man sehr viel Code, der unter Umständen häufig aufgerufen wird, zu einer einmaligen Sache herunter brechen. Insgesamt wird der Code dadurch nur noch schneller.

PS: Der beschriebene Code muss nicht ohne Fehler sein. Nur eine theoretische Implementierung.
 
Zuletzt bearbeitet:
Hi,

@saftmeister
Danke für dieses Beispiel.

Jedoch gibt mir eine Sache keine Ruhe. Und zwar wie PHP oder die MySQLi Schnittstelle das mit den Verbindungen intern handhaben. Hab mal folgendes Stück Code geschrieben.
PHP:
<?php
class Mysqliclass {
   public function setCon() {
      $mysqli = new mysqli("localhost", "root", "root", "bank");
      $request = $mysqli->query("SELECT * FROM konten");
      $result = $request->fetch_object();
      return $result;
   }
}

for( $i=0; i < 100; $i++ ) {
   $objMy = new Mysqliclass();
   var_dump( $objMy->setCon() );
}
?>

Laut meinem Verständnis müsste doch eigentlich 100 Verbindungen aufgebaut werden weil ich kein close() aufrufe jedoch zeigt mir der MySQL Administrator von Sun bei Serverstatus -> Connection Usage -> Current: 2 und bei Max: 3.
Kann man dann davon ausgehen, dass dieses new mysqli() eine falls vorhanden bestehende Verbindungen zurück gibt statt immer eine neue aufzubauen oder passiert das wo anders?
Auch PHPMyAdmin zeigt bei max. gleichzeitigen Verbindungen grade mal 5 statt 100 an :confused:
 
PHP:
for( $i=0; i < 100; $i++ ) {
   $objMy = new Mysqliclass();
   var_dump( $objMy->setCon() );
}

Da du jedes mal das alte Objekt wieder überschreibst, kann es zu keiner "Massenversammlung" kommen.

PHP:
for( $i=0; i < 100; $i++ ) {
   $objMy[$i] = new Mysqliclass();
   var_dump( $objMy[$i]->setCon() );
}

Versuch es mal so.
 
Hi,

danke für den Tipp. Wenn ich damit OFT bin dann mach ich neuen Thread auf.
Jetzt waren es grade mal max 8 gleichzeitige Verbindungen bei 1000 Schleifendurchläufen.
Teilt er alte Verbindungen zu oder schließt er schnell genug?

Beste Grüße
 
Hi,

danke für den Tipp. Hab es einmal gleich nach der Anweisung "new mysqli(...);" geschrieben und einmal eben in meiner for Schleife beidemal noch eine Zahl bzw. die Laufvariable um sicher zu gehen. Keine Fehler. Bleibt somit die Frage: Teilt er alte Verbindungen zu oder schließt er schnell genug? immer noch offen ^^
 
Zurück