我的基于 mod_perl2 的 Intranet 应用程序使用DBI->connect_cached()
据推测被覆盖Apache::DBI
的版本相同。它通常工作得很好,但就在最近,我们的测试服务器开始出现问题——只有两个用户连接——我们的应用程序有时会(但并非总是)在尝试使用“致命:”重新加载页面时死掉。抱歉,太多客户端已经连接到我们的 postgres 9.0 后端,尽管它们都已连接<IDLE>
如果我查看 pgadmin3 中的统计数据。
后端与我们的开发和生产后端是分开的,但它们都配置有max_connections = 100
。同样,httpd 服务都是独立的,但配置为
StartServers 8
MinSpareServers 5
MaxSpareServers 20
ServerLimit 99
MaxClients 99
MaxRequestsPerChild 4000
....
PerlModule Apache::DBI
我一直觉得我不应该打电话disconnect()
如果我希望它们真正从缓存中受益,则在我的数据库句柄上。难道我错了吗?如果没有,我想我会单独询问上述错误。只是想确定不是这个设置...
Apache::DBI 的文档 http://search.cpan.org/~phred/Apache-DBI/lib/Apache/DBI.pm say:
加载 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 的文档 http://search.cpan.org/~timb/DBI-1.630/DBI.pm say:
请注意,[ connect_cached ] 的行为在几个方面有所不同
尊重由实现的持久连接的行为
阿帕奇::DBI。但是,如果加载了 Apache::DBI,则 connect_cached
会使用它。
这听起来好像 Apache::DBI 实际上会影响 connect_cached,因为当我调用它时,我不会得到 DBI->connect_cached 行为,而是得到 Apache::DBI->connect 行为。 Apache::DBI 的文档建议不要这样做。
更新:我已将上述配置中的前 5 个参数全部设置为 1,并且当我点击其页面时,我的应用程序仍在使用越来越多的连接。我完全不明白这一点——它应该只有一个进程,并且一个进程应该重用它的连接。