Postgresql 如果我';我使用Apache::DBI';s connect_cached()?
我的基于mod_perl2的intranet应用程序使用Postgresql 如果我';我使用Apache::DBI';s connect_cached()?,postgresql,connection-pooling,dbi,apache2.2,mod-perl2,Postgresql,Connection Pooling,Dbi,Apache2.2,Mod Perl2,我的基于mod_perl2的intranet应用程序使用DBI->connect_cached(),这应该会被Apache::DBI的版本覆盖。它通常工作得很好,但就在最近,我们的测试服务器上出现了一个问题——只有两个用户连接——当我们尝试重新加载一个带有“致命:对不起,已经有太多客户端”连接到我们的postgres 9.0后端的页面时,我们的应用程序有时会死掉,但并非总是死掉,尽管所有这些都是,如果我看一下pgadmin3中的统计数据 后端与我们的开发和生产后端是分开的,但它们都配置了max\
DBI->connect_cached()
,这应该会被Apache::DBI
的版本覆盖。它通常工作得很好,但就在最近,我们的测试服务器上出现了一个问题——只有两个用户连接——当我们尝试重新加载一个带有“致命:对不起,已经有太多客户端”连接到我们的postgres 9.0后端的页面时,我们的应用程序有时会死掉,但并非总是死掉,尽管所有这些都是
,如果我看一下pgadmin3中的统计数据
后端与我们的开发和生产后端是分开的,但它们都配置了max\u connections=100
。同样,httpd服务都是独立的,但配置为
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 99
MaxClients 99
MaxRequestsPerChild 4000
....
PerlModule Apache::DBI
我的印象是,如果我想让数据库句柄从缓存中受益,就不应该对其调用disconnect()
。我错了吗?如果没有,我想我会分别询问上述错误。只是想确定不是这个设置
说:
加载DBI模块时(不要将其与Apache::DBI混淆)
模块)检查是否设置了环境变量“MOD_PERL”
如果模块Apache::DBI已加载。在这种情况下,每个
连接请求将转发到Apache::DBI模块。
....
无需从代码中删除disconnect语句。
他们不会做任何事情,因为Apache::DBI模块使
断开方法
如果您正在开发严格用于mod_perl的新代码,
您可以选择使用DBI> CONTULTYCACHED(),但是
如上所述,在每个请求之后添加自动回滚
所以我想对于我的mod_perl2-only应用程序,我不需要Apache::DBI,因为Apache::DBI的开发人员建议使用DBI->connect\u cached。我不需要断开连接的语句
然后说:
请注意,[connect_cached]的行为在几个方面有所不同
由实现的持久连接的行为方面
Apache::DBI。但是,如果加载了Apache::DBI,则连接缓存
我会用的
这听起来好像Apache::DBI实际上会影响connect_cached,在调用它时,我不会得到DBI->connect_cached行为,而是得到Apache::DBI->connect行为。而Apache::DBI的文档建议不要这样做
更新:我已将上述配置中的前5个参数全部设置为1,我的应用程序在访问页面时仍在使用越来越多的连接。这一点我一点也不理解——它应该只有一个进程,并且一个进程应该重新使用它的连接。除非您计划删除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;
}
;
}