2012-09-21 15 views
5

Ich benutze Zend Framework für meine PHP-Entwicklungen und hier ist eine kleine Funktion, die ich verwendet habe, um eine Abfrage auszuführen. Hier geht es nicht um einen Fehler. Der Code und alles funktioniert gut. Aber ich möchte ein Konzept dahinter wissen.Wie Zend DB Datenbankverbindungen verwalten

/** 
    * Get dataset by executing sql statement 
    * 
    * @param string $sql - SQL Statement to be executed 
    * 
    * @return bool 
    */ 
    public function executeQuery($sql) 
    { 
     $this->sqlStatement = $sql; 

     if ($this->isDebug) 
     { 
      echo $sql; 
      exit; 
     } 

     $objSQL = $this->objDB->getAdapter()->prepare($sql); 

     try 
     {   
      return $objSQL->execute(); 

     } 
     catch(Exception $error) 
     { 

      $this->logMessage($error->getMessage() . " SQL : " .$sql); 
      return false; 
     } 
     return false; 
    } 

Nach unten sind unklare Bereiche für mich.

  1. Wie Zend_Db_Table_Abstract Datenbankverbindungen aufrechterhalten?
  2. Erzeugt es immer neue Verbindung, wenn ich diese Funktion aufruft oder hat es einige Verbindungspooling?
  3. Ich habe keine Codierung zum Öffnen oder Schließen der Datenbankverbindung geschrieben. Wird zend Framework also automatisch Verbindungen schließen?
  4. Wenn diese Öffnungs- und Schließungsverbindung die ganze Zeit funktioniert, wenn ich diese Funktion ausführe, gibt es irgendein Leistungsproblem?

Vielen Dank und schätzen Sie Ihre Anregungen und Meinung zu diesem Thema.

Antwort

15

Verbindung erzeugen

eine Instanz der Adapterklasse Erstellen nicht sofort auf dem RDBMS-Server verbinden. Der Adapter speichert die Verbindungsparameter und stellt die aktuelle Verbindung auf Anforderung erstmals dar, die Sie benötigen, um eine Abfrage auszuführen. Dies stellt sicher, dass das Erstellen eines Adapter-Objekts schnell und kostengünstig ist. Sie können eine Instanz eines Adapters auch dann erstellen, wenn Sie nicht sicher sind, dass Sie während der aktuellen Anforderung Ihrer Anwendung Datenbankabfragen ausführen müssen.

Wenn Sie den Adapter zwingen müssen, eine Verbindung zum RDBMS herzustellen, verwenden Sie die Methode getConnection(). Diese Methode gibt ein Objekt für die Verbindung zurück, das durch die entsprechende PHP-Datenbankerweiterung repräsentiert wird. Wenn Sie beispielsweise eine der Adapterklassen für PDO-Treiber verwenden, gibt getConnection() das PDO-Objekt zurück, nachdem es als Live-Verbindung mit der spezifischen Datenbank initiiert wurde.

Es kann sinnvoll sein, die Verbindung zu erzwingen, wenn Sie Ausnahmen abfangen möchten, die aufgrund ungültiger Kontoanmeldeinformationen oder anderer fehlgeschlagener Verbindungen zum RDBMS-Server ausgelöst werden. Diese Ausnahmen werden nicht geworfen, bis die Verbindung hergestellt ist, so kann es helfen, den Anwendungscode zu vereinfachen, wenn Sie die Ausnahmen in einem Ort behandeln, statt zum Zeitpunkt der ersten Abfrage der Datenbank.

Darüber hinaus kann ein Adapter serialisiert werden, um ihn beispielsweise in einer Sitzungsvariablen zu speichern. Dies kann sehr nützlich sein, nicht nur für den Adapter selbst, sondern auch für andere Objekte, die es aggregieren, wie ein Zend_Db_Select-Objekt. Standardmäßig sind Adapter serialisiert werden erlaubt, wenn Sie es nicht wollen, sollten Sie die mit FALSCH Zend_Db :: ALLOW_SERIALIZATION Option vorbei, siehe das obige Beispiel. Um das Prinzip der Lazy-Verbindungen zu respektieren, wird der Adapter die Verbindung nach der Serialisierung nicht wiederherstellen. Sie müssen dann getConnection() selbst aufrufen. Sie können den Adapter automatisch wieder verbinden lassen, indem Sie Zend_Db :: AUTO_RECONNECT_ON_UNSERIALIZE mit TRUE als Adapteroption übergeben.

Schließen einer Verbindung

Normalerweise eine Datenbankverbindung ist es nicht notwendig zu schließen. PHP bereinigt automatisch alle Ressourcen und das Ende einer Anfrage. Datenbankerweiterungen dienen dazu, die Verbindung zu schließen, wenn der Verweis auf das Ressourcenobjekt bereinigt wird.

Wenn Sie jedoch ein PHP-Skript mit langer Dauer haben, das viele Datenbankverbindungen initiiert, müssen Sie möglicherweise die Verbindung schließen, um zu vermeiden, dass die Kapazität Ihres RDBMS-Servers erschöpft ist. Sie können die closeConnection() - Methode des Adapters verwenden, um die zugrunde liegende Datenbankverbindung explizit zu schließen.

Seit Release 1.7.2 konnten Sie mit der Methode isConnected() überprüfen, ob Sie gerade mit dem RDBMS-Server verbunden sind. Dies bedeutet, dass eine Verbindungsressource initiiert wurde und nicht geschlossen wurde. Diese Funktion ist derzeit nicht in der Lage, beispielsweise ein serverseitiges Schließen der Verbindung zu testen. Dies wird intern zum Schließen der Verbindung verwendet. Es ermöglicht Ihnen, die Verbindung mehrmals ohne Fehler zu schließen. Es war bereits vor Version 1.7.2 für PDO-Adapter der Fall, nicht jedoch für die anderen.

More information