我们有一个在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将共享给分叉进程。
我们正在尝试将此应用程序迁移到新构建的服务器,我们得到一些非常奇怪的间歇性行为,即:
现在,我知道DBD :: MySQL和底层C库不支持向分叉进程共享句柄,我们需要修复我们的代码,这样才不会发生。但我的问题是:为什么我们当前的生产环境没有问题?新服务器在我所知道的每个方面都是相同的:
我们的生产环境中有什么神奇之处可以让我们的应用程序正常工作?