2008-10-15 5 views
6

Angenommen, ich habe einen Perl-Code, der bei jedem Treffer eine Spalte in einer bestimmten Zeile einer Datenbank inkrementiert, und ich erwarte, dass sie ziemlich häufig getroffen wird. Daher möchte ich sie mit FCGI optimieren. Gerade jetzt, wickelte ich im Grunde die meisten der Code in etwa so:Muss ich die DB-Verbindung/Initialisierung außerhalb der FCGI-Schleife platzieren, um FastCGI in Perl nutzen zu können?

while (FCGI::accept() >= 0) { 
[code which currently creates a db connection and makes calls through it] 
} 

Ich frage mich, ob es besser ist, die Datenbank-Verbindung zu setzen (my $ dbh = DBI-> connect (etc)), die außerhalb des FCGI-Schleife, so dass das Skript die Verbindung am Leben erhält, oder werde ich immer noch die Vorteile von FCGI in Geschwindigkeit & Ressourcen bekommen, indem Sie es in der Schleife verlassen?

Antwort

1

Sie würden immer noch von FCGI profitieren, auch wenn Sie Ihre DB-Verbindung in der Schleife halten - aber Sie würden noch mehr gewinnen, wenn Sie es auszogen.

1

Die Verbindungsleistung hängt weitgehend von der verwendeten Datenbank ab. PostgreSQL und MySQL sind sehr schnell zu verbinden (besonders MySQL) und verbinden sich daher normalerweise bei jeder Anfrage. Andere Datenbanken wie Oracle sind etwas langsamer und erfordern häufig längere Verbindungszeiten. Es sollte einfach zu testen sein, indem Sie eine while 1..100000-Schleife mit DBI-> connect() schreiben und trennen, um zu sehen, wie schnell Ihre Datenbank ist.

3

bmdhacks ist richtig, wenn Sie MySQL oder PostgreSQL verwenden, ist es nicht so wichtig, da Verbindungen ziemlich billig sind. Aber unabhängig von Ihrer Datenbank haben Sie Geschwindigkeitsgewinne durch persistente Verbindungen.

Aber wenn Sie sich entscheiden, mit dauerhaften Verbindungen zu gehen, müssen Sie sich um Verbindungstimeouts kümmern. Dies geschieht zu jedem beliebigen Zeitpunkt während der Laufzeit Ihres Programms, abhängig von Ihren Servereinstellungen und der Menge an Verkehr, die Sie erhalten. ping() ist dein Freund hier. Und wenn Sie mehr Hilfe benötigen, schauen Sie sich an, wie Apache::DBI es tut.

2

Stellen Sie die Verbindung nicht außerhalb der Schleife, Sie könnten die Verbindung verlieren und dann können Sie die Verbindung nicht wiederherstellen. Du könntest es in eine globale setzen, aber dann musst du die Verbindung überprüfen und dich erneut verbinden.

Verwenden Sie stattdessen Ima::DBI oder DBI->connect_cached(), um das Verbindungscachen für Sie durchzuführen. Es wird alle Arbeit tun, um sicherzustellen, dass die Verbindung aktiv ist, und die Verbindung bei Bedarf wiederherstellen.

Aber bevor Sie sich kümmern, machen Sie ein Benchmarking, um herauszufinden, wo Ihr Flaschenhals wirklich ist. Ich hatte die Datenbankverbindung in der Vergangenheit der Flaschenhals, aber das war mit Oracle und es war auch vor 10 Jahren.