http://www.postgresql-support.de

Persistente Datenbankverbindungen

PHP war eine der ersten Programmiersprachen, die persistente Datenbankverbindungen unterstützt hat. Vor einigen Jahren war die Unterstützung für persistente Verbindungen in vielen Fällen sogar das entscheidende Argument für den Einsatz von PHP. Mittlerweile haben andere Programmiersprachen nachgezogen und persistente Verbindungen sind allgemein akzeptiert und finden großen Anklang.

Beim Aufbau einer Datenbankverbindung muss im Fall von PostgreSQL ein gesamter Prozess geklont werden. Vor allem bei Web-Anwendungen führt das zu etwas erhöhten Reaktionszeiten sowie zu signifikantem Overhead, da das Klonen des Prozesses wesentlich länger als das Ausführen der SQL Statements dauert.

Im Fall von PHP können persistente Verbindungen mit Hilfe der Funktion pg_pconnect realisiert werden. Aus Sicht des Programmierers unterscheidet sich das Aufbauen einer persistenten Verbindung nicht vom Aufbau einer normalen Verbindung - unter der Haube passieren jedoch fundamental unterschiedliche Dinge: Wenn ein Benutzer ein pg_pconnect absetzt, sieht PHP nach, ob bereits eine alte Datenbankverbindung besteht. Wenn das der Fall ist, wird diese Verbindung 'gesäubert' (= ROLLBACK, etc.) und direkt zugewiesen - im Prinzip wird also nur eine alte Verbindung recycled. Ist eine Verbindung mit den entsprechenden Parametern nicht im Pool verfügbar, wird eine 'echte' Verbindung zur Datenbank aufgebaut. Hat der Benutzer nun alle gewünschten Befehle abgesetzt, wird sie aus seiner Sicht einfach terminiert - intern wird die Verbindung jedoch wieder in den Pool geworfen und kann somit weiterverwendet werden.

Das Verwenden persistenter Verbindungen kann zu substantiellen Performancegewinnen führen:

<?php
        $cstr="host=localhost dbname=test user=hs";
        $maxcon = 1000;

        /* nicht-persistente datenbankverbindungen */
        $starttime = time();
        for ($i = 0; $i < $maxcon; $i++)
        {
                $conn = @pg_connect ($cstr);
                @pg_close ($conn);
        }
        $endtime = time();

        /* persistente datenbankverbindungen */
        $starttimep = time();
        for ($i = 0; $i < $maxcon; $i++)
        {
                $connp = @pg_pconnect ($cstr);
                @pg_close ($connp);
        }
        $endtimep = time();

        /* ausgabe */
        $diff = $endtime - $starttime;
        $diffp = $endtimep - $starttimep;
        echo ("pg_connect: $diff<br>pg_pconnect: $diffp");
?>

Wir haben einen Mini Test durchgeführt und haben die folgenden Ergebnisse (in Sekunden) ermittelt:

pg_connect: 8
pg_pconnect: 0

Der Aufbau von 1000 Verbindungen hat in diesem Szenario etwa 8 Sekunden gedauert - das Recyclen von ebensovielen Prozessen geht auf unserer Testinstallation in weniger als einer Sekunden von Statten.

Vor allem bei Anwendungen, wo relativ wenig oder nur einfaches SQL abgesetzt wird, nimmt der Verbindungsaufbau gemessen am Gesamtaufwand sehr viel Zeit weg - in solchen Fällen machen persistente Verbindungen auch am meisten Sinn.

http://www.postgresql.at