2013-12-09 3 views
0

Мое приложение для интрасети на основе 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, и мое приложение все еще использует все больше и больше подключений, когда я попадал на его страницы. Это я совсем не понимаю - у него должен быть только один процесс, и один процесс должен повторно использовать его соединение.не

ответ

0

Если вы не планируете падать Apache :: DBI, ответ фирма, нет, потому что Apache::DBI's override действительно ничего не делает:

# overload disconnect 
{ 
    package Apache::DBI::db; 
    no strict; 
    @ISA=qw(DBI::db); 
    use strict; 
    sub disconnect { 
     my $prefix = "$$ Apache::DBI   "; 
     Apache::DBI::debug(2, "$prefix disconnect (overloaded)"); 
     1; 
    } 
    ; 
} 
Смежные вопросы