我的基于mod_perl2的内部网应用使用了DBI->connect_cached()
,它被Apache::DBI
的版本所覆盖。它通常工作得很好,但就在最近我们开始在我们的测试服务器上遇到一个问题 - 它只有两个用户连接 - 我们的应用程序有时(但并不总是)在尝试使用'FATAL重新加载页面时死亡:抱歉,太多客户已经'连接到我们的postgres 9.0后端,尽管如果我查看pgadmin3中的统计信息,它们都是<IDLE>
。
后端与我们的开发和生产后端是分开的,但它们都配置了max_connections = 100
。同样,httpd服务都是独立的,但配置了
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 99
MaxClients 99
MaxRequestsPerChild 4000
....
PerlModule Apache::DBI
我的印象是,如果我希望他们真正从缓存中受益,我不应该在我的数据库句柄上调用disconnect()
。我错了吗?如果没有,我想我会分别询问上述错误。只是想确保它不是这个设置...
加载DBI模块时(不要将其与Apache :: DBI混淆) module)它检查是否已设置环境变量'MOD_PERL' 如果已加载模块Apache :: DBI。在这种情况下每一个 connect请求将被转发到Apache :: DBI模块。 .... 无需从代码中删除disconnect语句。 他们不会做任何事情因为Apache :: DBI模块重载了 断开方法。
如果您正在开发严格用于mod_perl的新代码, 您可以选择使用DBI-&gt; connect_cached(),但请考虑 如上所述,在每个请求后添加自动回滚。
所以我猜我的mod_perl2应用程序,我不需要Apache :: DBI,因为Apache :: DBI的开发人员建议使用DBI-&gt; connect_cached。我不需要断开连接声明。
但后来DBI's docs说:
请注意,[connect_cached]的行为有几个不同 尊重由实现的持久连接的行为 阿帕奇:: DBI。但是,如果加载Apache :: DBI,则connect_cached 将使用它。
这听起来像Apache :: DBI实际上会影响connect_cached,因为当我调用它时,我将得到Apache :: DBI-&gt;连接行为,而不是获得DBI-&gt; connect_cached行为。 Apache :: DBI的文档建议不要这样做。
更新:我已将上面配置中的前5个参数全部设置为1,当我点击其页面时,我的应用程序仍在用尽越来越多的连接。我根本不明白 - 它应该只有一个进程,并且一个进程应该重新使用它的连接。
答案 0 :(得分: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;
}
;
}