Sollte ich disconnect () verwenden, wenn ich connect_cached () von Apache :: DBI verwende?

Meine mod_perl2-basierte Intranet-App verwendetDBI->connect_cached() was angeblich von überschrieben wirdApache::DBI's Version desselben. Normalerweise hat es ganz gut geklappt, aber erst kürzlich hatten wir ein Problem mit unserem Testserver - bei dem nur zwei Benutzer verbunden waren -, bei dem unsere App manchmal, aber nicht immer abstürzte, wenn versucht wurde, eine Seite mit 'FATAL: Es tut uns leid, aber zu viele Kunden haben bereits eine Verbindung zu unserem Backend für Postgres 9.0 hergestellt<IDLE> wenn ich mir die stats in pgadmin3 ansehe.

Das Backend ist von unseren Entwicklungs- und Produktions-Backends getrennt, sie sind jedoch alle mit konfiguriertmax_connections = 100. Ebenso sind die httpd-Dienste alle separat, aber mit konfiguriert

StartServers       8
MinSpareServers    5
MaxSpareServers   20
ServerLimit      99
MaxClients       99
MaxRequestsPerChild  4000
....
PerlModule Apache::DBI

Ich hatte den Eindruck gehabt, dass ich nicht anrufen solltedisconnect() in meinen Datenbank-Handles, wenn ich wollte, dass sie tatsächlich vom Caching profitieren. Habe ich mich geirrt? Wenn nicht, werde ich den obigen Fehler wohl separat erfragen. Ich wollte nur sicherstellen, dass es nicht dieses Setup war ...

Apache :: DBI's Dokumente sagen:

Beim Laden des DBI-Moduls (nicht mit dem Apache :: DBI-Modul verwechseln) wird geprüft, ob die Umgebungsvariable 'MOD_PERL' gesetzt wurde und ob das Modul Apache :: DBI geladen wurde. In diesem Fall wird jede Verbindungsanforderung an das Apache :: DBI-Modul weitergeleitet. .... Sie müssen die Anweisungen zum Trennen der Verbindung nicht aus Ihrem Code entfernen. Sie werden nichts tun, da das Apache :: DBI-Modul die Trennungsmethode überlastet.

Wenn Sie neuen Code entwickeln, der ausschließlich für die Verwendung in mod_perl vorgesehen ist, können Sie stattdessen DBI-> connect_cached () verwenden. Sie können jedoch nach jeder Anforderung ein automatisches Rollback hinzufügen, wie oben beschrieben.

Ich denke, für meine App, die nur mod_perl2 enthält, brauche ich Apache :: DBI nicht, da die Entwickler von Apache :: DBI die Verwendung von DBI-> connect_cached empfehlen. Und ich brauche keine Anweisungen zum Trennen der Verbindung.

Aber dannDBIs Dokumente sagen:

Beachten Sie, dass sich das Verhalten von [connect_cached] in mehrfacher Hinsicht vom Verhalten persistenter Verbindungen unterscheidet, die von Apache :: DBI implementiert wurden. Wenn jedoch Apache :: DBI geladen ist, wird es von connect_cached verwendet.

Das klingt so, als würde Apache :: DBI tatsächlich connect_cached beeinflussen, da ich, anstatt DBI-> connect_cached-Verhalten zu erhalten, Apache :: DBI-> connect-Verhalten erhalte. Und die Dokumente von Apache :: DBI empfehlen dagegen.

UPDATE: Ich habe die ersten 5 Parameter in der obigen Konfiguration auf 1 gesetzt und meine App verbraucht immer mehr Verbindungen, während ich auf ihre Seiten gehe. Dies verstehe ich überhaupt nicht - es sollte nur einen Prozess haben, und dieser eine Prozess sollte seine Verbindung wiederverwenden.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage