Postgresql 如果我';我使用Apache::DBI';s connect_cached()?

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\

我的基于mod_perl2的intranet应用程序使用
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;
  }
  ;
}