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