我在子进程中使用 Apache::DBI 时遇到问题。问题是 Apache::DBI 为所有使用它的进程提供了一个句柄,所以我得到
DBD::mysql::db selectall_arrayref 失败:命令不同步;您现在无法在 /usr/local/www/apache22/data/test-fork.cgi 第 20 行运行此命令。
重新连接没有帮助,因为 Apache::DBI 在所有进程中重新连接,因为我理解以下错误
服务器遇到内部错误,无法完成您的请求。
错误消息:DBD 驱动程序尚未在 /usr/local/lib/perl5/site_perl/5.8.9/Apache/DBI.pm 第 283 行实现 AutoCommit 属性。,
这是原始代码:
use Data::Dumper 'Dumper';
use DBI ();
my $dbh = DBI->connect($dsn, $username, $password, {
RaiseError => 1,
PrintError => 0,
});
my $file = "/tmp/test-fork.tmp";
my $pid = fork;
defined $pid or die "fork: $!";
if ($pid) {
my $rows = eval { $dbh->selectall_arrayref('SELECT SLEEP(1)') };
print "Content-Type: text/plain\n\n";
print $rows ? "parent: " . Dumper($rows) : $@;
}
else {
my $rows = eval { $dbh->selectall_arrayref('SELECT SLEEP(1)') };
open FH, '>', $file or die "$file: $!";
print FH $rows ? "child: " . Dumper($rows) : $@;
close FH;
}
我用于重新连接的代码:
...
else {
$dbh->disconnect;
$dbh = DBI->connect($dsn, $username, $password, $attrs);
my $rows = eval { $dbh->selectall_arrayref('SELECT SLEEP(1)') };
open FH, '>', $file or die "$file: $!";
print FH $rows ? "child: " . Dumper($rows) : $@;
close FH;
}
有没有一种安全的方法来使用 Apache::DBI 和分叉?有没有办法让它创建一个新的连接?