我尝试过使用Perl fork manager和DBI。 但是我得到了错误 DBD :: mysql :: st执行失败:在查询期间丢失了与MySQL服务器的连接。
这里是示例代码:我想在低值到高值之间进行查询(我已经吐出10k记录)
use Parallel::ForkManager;
my $pm = new Parallel::ForkManager(50);
my $db = krish::DB->new or die $!; # its has all connection details
while ( $low < $high ) {
# Some value manipulation
my $pid = $pm->start and next;
#db_execution returns execution
while ( my $sth = db_execution ( $db, $low , $high ) ) {
...
#fetch row operation
...
}
$pm->finish;
}
sub db_execution {
...
my $dbh = $db->connect( 'students' ) or die $!;
my $sth = $dbh->prepare( $sql ) or die "$!:" . $dbh->errstr;
$sth->execute or die "$!:" . $sth->errstr;
...
}
执行相同的代码并执行并行处理。有什么问题? 怎么解决这个?
答案 0 :(得分:9)
当您在进程之间共享数据库连接时(这是您使用fork执行的操作),您需要确保一个进程不会从另一个进程中关闭它。因为连接也是变量,所以当Perl解释器关闭时,它将调用该对象的DESTROY方法,在这种情况下将关闭连接。
因此,如果任何子节点关闭数据库连接(将在完成和关闭时发生),它将从父进程下将其终止。防止这种情况的方法是在fork之前在父进程中将InactiveDestroy
设置为true,然后在完成时在父进程中显式关闭连接。
答案 1 :(得分:0)
通过在所有子进程中同时使用相同的db句柄,您会遇到麻烦。您应该在每个孩子中创建一个新连接。
没关系......我读了其余的代码。