DBI只在一台服务器上处理Apache中DBD::MySQL的共享问题
我们有一个在Apache中运行的应用程序,带有prefork MPM和mod_perl2。它使用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
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记录”消息
- 相同的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。我将看看是否有一种方法可以测试较低版本在“糟糕”的环境中是否正常工作。