Мое приложение для интрасети на основе mod_perl2 использует DBI->connect_cached()
, который предположительно переопределяется по версии Apache::DBI
. Обычно это нормально работает, но совсем недавно у нас возникла проблема на нашем тестовом сервере, в котором было подключено только два пользователя, и иногда наше приложение, но не всегда, умирало при попытке перезагрузки страницы с помощью FATAL: извините, слишком много клиентов уже «подключились к нашему бэкэнду postgres 9.0, несмотря на то, что все они были <IDLE>
, если я посмотрю статистику в pgadmin3.Должен ли я отключить(), если я использую Apache :: DBI connect_cached()?
Бэкэнд отдельно от наших баз данных разработки и производства, но все они сконфигурированы с max_connections = 100
. Подобным же образом HTTPD услуги все отдельно, но сконфигурировано с
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 99
MaxClients 99
MaxRequestsPerChild 4000
....
PerlModule Apache::DBI
я был под впечатлением, что я не должен называть disconnect()
на моей базе данных обрабатывает, если бы я хотел, чтобы они на самом деле выгоду от кэширования. Я был в этом не прав? Если нет, я думаю, что я спрошу об этой ошибке отдельно. Просто хотел убедиться, что она не была эта установка ...
Apache::DBI's docs говорят:
При загрузке модуль DBI (не путать с модуля Apache :: DBI) он проверяет, является ли переменная среды 'MOD_PERL' была установлена и если был загружен модуль Apache :: DBI. В этом случае каждый запрос на соединение будет перенаправлен в модуль Apache :: DBI. .... Нет необходимости удалять инструкции разъединения из вашего кода. Они ничего не сделают, потому что модуль Apache :: DBI перегружает метод разъединения .
Если вы разрабатываете новый код, который строго для использования в mod_perl, вы можете использовать DBI-> connect_cached() вместо этого, но рассмотреть добавление автоматический откат после каждого запроса, как описано выше.
Я думаю, что для моего приложения mod_perl2 мне не нужен Apache :: DBI, потому что разработчики Apache :: DBI рекомендуют использовать DBI-> connect_cached. И мне не нужны инструкции разъединения.
Но DBI's docs сказать:
Обратите внимание, что поведение [connect_cached] отличается в нескольких отношениях от поведения постоянных соединений, реализованных Apache :: DBI. Однако, если Apache :: DBI загружен, то connect_cached будет использовать его.
Это делает его звук, как Apache :: DBI будет на самом деле влияют на connect_cached, в том, что вместо того, чтобы DBI-> connect_cached поведение, когда я звоню, что я буду получать Apache :: DBI-> подключить поведение. И рекомендации Apache :: DBI рекомендуют.
ОБНОВЛЕНИЕ: Я установил первые 5 параметров в приведенной выше конфигурации all to 1, и мое приложение все еще использует все больше и больше подключений, когда я попадал на его страницы. Это я совсем не понимаю - у него должен быть только один процесс, и один процесс должен повторно использовать его соединение.не