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

DBI只在一台服务器上处理Apache中DBD::MySQL的共享问题,mysql,apache,perl,fork,dbi,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

我们有一个在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中,这会导致在Apache控制进程启动时运行db初始化代码。因此,$dbh被共享给分叉进程

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

  • 查询有时会返回明显来自另一个查询的结果
  • 我们偶尔会遇到“查询过程中与MySQL服务器的连接丢失”
  • DBI跟踪显示了大量“句柄未处于异步模式错误2000记录”消息
现在,我了解到DBD::MySQL和底层C库不支持将句柄共享给分叉进程,我们需要修复代码,这样就不会发生这种情况。但我的问题是:为什么我们当前的生产环境没有问题呢?新服务器在我所知道的各个方面都是相同的:

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

在我们的生产环境中有什么魔力可以让我们的应用程序正常工作?

您在每个系统上运行的是什么版本的DBI和DBD::mysql?您是否在这两个服务器上都配置了相同的日志记录?(可能错误只是没有登录到一个系统上,或者它们要去一个你不期望的地方。)DBI跟踪是否一致地或间歇地显示异步模式错误?你在两个系统上都做了跟踪吗?@ThisSuitesBlacknot-我已经用DBI和DBD::mysql版本更新了这个问题。回答其他问题:两个系统上的日志记录配置相同。这些错误实际上出现在应用程序中,而不仅仅是日志中,而且它们只发生在受影响的系统上。我只对受影响的系统进行了DBI跟踪。在该跟踪中,“异步模式”错误在任何时候执行语句时都会非常一致地出现。两者的版本相同吗?两者的startup.pl是否相同?环境是一样的吗?@jcaron-环境变量和startup.pl是一样的。mod_perl2的版本略有不同,在“好”环境中为2.000005,在“坏”环境中为2.000008。我将看看是否有一种方法可以测试较低版本在“坏”环境中是否正常工作。您在每个系统上运行的是哪个版本的DBI和DBD::mysql?您是否在这两个服务器上都配置了相同的日志记录?(可能错误只是没有登录到一个系统上,或者它们要去一个你不期望的地方。)DBI跟踪是否一致地或间歇地显示异步模式错误?你在两个系统上都做了跟踪吗?@ThisSuitesBlacknot-我已经用DBI和DBD::mysql版本更新了这个问题。回答其他问题:两个系统上的日志记录配置相同。这些错误实际上出现在应用程序中,而不仅仅是日志中,而且它们只发生在受影响的系统上。我只对受影响的系统进行了DBI跟踪。在该跟踪中,“异步模式”错误在任何时候执行语句时都会非常一致地出现。两者的版本相同吗?两者的startup.pl是否相同?环境是一样的吗?@jcaron-环境变量和startup.pl是一样的。mod_perl2的版本略有不同,在“好”环境中为2.000005,在“坏”环境中为2.000008。我将看看是否有一种方法可以测试较低版本在“糟糕”的环境中是否正常工作。