5

我已经尝试过 Perl fork manager 和 DBI 。但我收到错误DBD::mysql::st execute failed: Lost connection to MySQL server during query 。

这里是示例代码:我想在低值到高值之间进行查询(我已经吐出 int 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;
    ...
}

相同的代码在没有并行处理的情况下执行。问题是什么?这是怎么解决的?

4

2 回答 2

9

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

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

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

于 2009-07-28T14:49:54.560 回答
0

您在所有子进程中同时使用相同的数据库句柄是在自找麻烦。您应该在每个孩子中创建一个新的连接。

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

于 2009-07-28T16:31:08.553 回答