如果我使用Apache :: DBI的connect_cached(),我应该断开()吗?

时间:2013-12-09 16:48:08

标签: postgresql connection-pooling dbi apache2.2 mod-perl2

我的基于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()。我错了吗?如果没有,我想我会分别询问上述错误。只是想确保它不是这个设置...

Apache::DBI's docs说:

  

加载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,当我点击其页面时,我的应用程序仍在用尽越来越多的连接。我根本不明白 - 它应该只有一个进程,并且一个进程应该重新使用它的连接。

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;
  }
  ;
}