Czy powinienem się rozłączyć (), jeśli używam Apache :: DBI's connect_cached ()?

Używa mojej aplikacji intranetowej opartej na mod_perl2DBI->connect_cached() który jest rzekomo nadpisany przezApache::DBIwersja tego samego. Zwykle działał całkiem dobrze, ale niedawno zaczęliśmy mieć problem na naszym serwerze testowym - do którego podłączono tylko dwóch użytkowników - przy czym nasza aplikacja czasami, ale nie zawsze, umierała, próbując ponownie załadować stronę za pomocą „FATAL: przepraszam, zbyt wielu klientów już „łączy się z naszym zapleczem Postgres 9.0, mimo że wszystkie są<IDLE> jeśli spojrzę na statystyki w pgadmin3.

Backend jest oddzielony od naszego zaplecza programistycznego i produkcyjnego, ale wszystkie są skonfigurowane za pomocąmax_connections = 100. Podobnie wszystkie usługi httpd są oddzielne, ale skonfigurowane za pomocą

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

Miałem wrażenie, że nie powinienem dzwonićdisconnect() na moich uchwytach bazy danych, jeśli chciałbym, żeby faktycznie korzystali z buforowania. Czy myliłem się co do tego? Jeśli nie, myślę, że osobiście zapytam o powyższy błąd. Chciałem się tylko upewnić, że to nie była ta konfiguracja ...

Dokumenty Apache :: DBI mówić:

Podczas ładowania modułu DBI (nie mylić tego z modułem Apache :: DBI) sprawdza, czy ustawiono zmienną środowiskową „MOD_PERL” i czy załadowano moduł Apache :: DBI. W takim przypadku każde żądanie połączenia zostanie przekazane do modułu Apache :: DBI. .... Nie ma potrzeby usuwania instrukcji rozłączenia z kodu. Nie zrobią nic, ponieważ moduł Apache :: DBI przeciąża metodę rozłączania.

Jeśli tworzysz nowy kod, który jest przeznaczony wyłącznie do użycia w mod_perl, możesz zamiast tego użyć DBI-> connect_cached (), ale rozważ dodanie automatycznego wycofania po każdym żądaniu, jak opisano powyżej.

Domyślam się, że dla mojej aplikacji mod_perl2-only nie potrzebuję Apache :: DBI, ponieważ deweloperzy Apache :: DBI zalecają używanie DBI-> connect_cached. I nie potrzebuję instrukcji rozłączania.

Ale wtedyDokumenty DBI mówić:

Zauważ, że zachowanie [connect_cached] różni się pod kilkoma względami od zachowania trwałych połączeń realizowanych przez Apache :: DBI. Jeśli jednak załadowano Apache :: DBI, użyje go connect_cached.

To sprawia, że ​​brzmi to tak, jakby Apache :: DBI rzeczywiście wpłynie na connect_cached, ponieważ zamiast uzyskać zachowanie DBI-> connect_cached, gdy to wywołam, otrzymam zachowanie Apache :: DBI-> connect. A dokumenty Apache :: DBI zalecają to.

UPDATE: Ustawiłem pierwsze 5 parametrów w powyższej konfiguracji na 1, a moja aplikacja wciąż korzysta z coraz większej liczby połączeń, gdy trafiam na jej strony. Tego w ogóle nie rozumiem - powinien mieć tylko jeden proces, a jeden proces powinien ponownie wykorzystywać swoje połączenie.

questionAnswers(1)

yourAnswerToTheQuestion