DBI只在一台服务器上处理Apache中DBD :: MySQL的共享问题

时间:2015-12-11 16:13:59

标签: mysql apache perl fork dbi

我们有一个在Apache中使用prefork MPM和mod_perl2运行的应用程序。它使用DBD :: mysql进行数据库连接,它有很多模块在加载时初始化准备好的语句,如下所示:

use DBI;

my $dbh = DBI->connect($connection_string, $user);
my $sth = $dbh->prepare("SELECT column FROM table WHERE other_column = ?");

sub new {
    # ...
}

其中一些模块在startup.pl中加载,这导致db初始化代码在Apache控制进程启动时运行。因此,$ dbh将共享给分叉进程。

我们正在尝试将此应用程序迁移到新构建的服务器,我们得到一些非常奇怪的间歇性行为,即:

  • 查询有时会返回明显来自其他查询的结果
  • 我们偶尔会在查询期间收到“与MySQL服务器连接丢失”
  • DBI跟踪显示了很多“处理不是异步模式错误2000记录”消息

现在,我知道DBD :: MySQL和底层C库不支持向分叉进程共享句柄,我们需要修复我们的代码,这样才不会发生。但我的问题是:为什么我们当前的生产环境没有问题?新服务器在我所知道的每个方面都是相同的:

  • 相同的Ubuntu版本(12.04)
  • 相同的Apache版本(2.2)
  • 相同版本的DBI(1.616)和DBD :: mysql(4.020)
  • 相同的Apache配置和启用的模块
  • 相同的MySQL客户端配置
  • MySQL客户端二进制文件的相同版本(50531)和编译设置(特别是enable-thread-safe-client)
  • 相同的代码,包括startup.pl和envvars
  • 连接到同一个MySQL服务器

我们的生产环境中有什么神奇之处可以让我们的应用程序正常工作?

0 个答案:

没有答案
相关问题