为什么我无法从Perl中的分叉子查询数据库?

时间:2009-07-28 08:35:31

标签: mysql perl parallel-processing dbi

我尝试过使用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;
    ...
}

执行相同的代码并执行并行处理。有什么问题? 怎么解决这个?

2 个答案:

答案 0 :(得分:9)

当您在进程之间共享数据库连接时(这是您使用fork执行的操作),您需要确保一个进程不会从另一个进程中关闭它。因为连接也是变量,所以当Perl解释器关闭时,它将调用该对象的DESTROY方法,在这种情况下将关闭连接。

因此,如果任何子节点关闭数据库连接(将在完成和关闭时发生),它将从父进程下将其终止。防止这种情况的方法是在fork之前在父进程中将InactiveDestroy设置为true,然后在完成时在父进程中显式关闭连接。

https://metacpan.org/pod/DBI#InactiveDestroy

答案 1 :(得分:0)

通过在所有子进程中同时使用相同的db句柄,您会遇到麻烦。您应该在每个孩子中创建一个新连接。

没关系......我读了其余的代码。