Должен ли я отключиться (), если я использую 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, и мое приложение все еще использует все больше и больше соединений, когда я нажимаю на его страницы. Этого я совсем не понимаю - у него должен быть только один процесс, и этот процесс должен повторно использовать свое соединение.
1 ответ
Если вы не планируете удалить Apache::DBI, ответ - "нет", потому что переопределение Apache:: DBI действительно ничего не делает:
# 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;
}
;
}