【发布时间】:2013-12-26 21:03:03
【问题描述】:
我的基于 mod_perl2 的 Intranet 应用程序使用 DBI->connect_cached(),它应该被 Apache::DBI 的相同版本覆盖。它通常工作得很好,但就在最近我们的测试服务器上开始出现问题 - 只有两个用户连接 - 我们的应用程序有时但并非总是在尝试重新加载带有“致命:”的页面时死机:抱歉,已经有太多客户连接到我们的 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 混淆 模块)它检查是否已设置环境变量“MOD_PERL” 如果模块 Apache::DBI 已经加载。在这种情况下,每 连接请求将被转发到 Apache::DBI 模块。 …… 无需从代码中删除断开连接语句。 他们不会做任何事情,因为 Apache::DBI 模块重载了 断开方法。
如果您正在开发严格用于 mod_perl 的新代码, 您可以选择使用 DBI->connect_cached() 代替,但考虑 如上所述,在每个请求后添加自动回滚。
所以我想对于我的 mod_perl2-only 应用程序,我不需要 Apache::DBI,因为 Apache::DBI 的开发人员建议使用 DBI->connect_cached。而且我不需要断开连接语句。
然后DBI's docs 说:
请注意 [connect_cached] 的行为在几个方面有所不同 从持久连接的行为方面的方面实现 阿帕奇::DBI。但是,如果 Apache::DBI 已加载,则 connect_cached 会用的。
这听起来像是 Apache::DBI 实际上会影响 connect_cached,因为当我调用它时,我将获得 Apache::DBI->connect 行为,而不是获得 DBI->connect_cached 行为。 Apache::DBI 的文档建议不要这样做。
更新:我已将上述配置中的前 5 个参数全部设置为 1,当我点击它的页面时,我的应用程序仍在使用越来越多的连接。这我根本不明白——它应该只有一个进程,并且一个进程应该重用它的连接。
【问题讨论】:
标签: postgresql connection-pooling dbi apache2.2 mod-perl2