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

joe*_*joe 5 mysql parallel-processing perl 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;
    ...
}
Run Code Online (Sandbox Code Playgroud)

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

mpe*_*ers 9

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

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

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

  • 另一种方法是在你的`fork()`之后打开数据库连接.这样每个孩子都有自己的联系,他们不能互相干扰.在多个进程之间共享单个连接通常不是一个好主意. (3认同)