Fork + DBI和语句句柄

时间:2016-08-31 08:16:55

标签: perl fork dbi

场合

所以我知道连接在进程间共享,我不能使用我在子进程中的fork之前打开的连接。

我也知道perl会在我尝试做这样的事情时抱怨:

my $sth = $dbConn->prepare($sql);
$sth->execute();
$dbConn->disconnect();
while(my @row = $sth->fetchrow_array){
    print @row,"\n";
}

因为我在语句句柄仍处于活动状态时尝试断开连接。

为什么会这样:

my $sth = $dbConn->prepare($sql);
$sth->execute();
while(my @row = $sth->fetchrow_array){
    my $pid = fork; 
    if(not defined $pid){
        warn "Could not fork\n";
        next;  # abort loop
    }
    if($pid){
        #Parent: Do nothing
    }
    else{ 
        #do stuff
        exit;
    }
}

如果孩子在退出时将其关闭,那么perl会不会抱怨声明句柄仍处于活动状态?我还确保在循环完全迭代之前某些进程的执行已经结束,并认为它可能会抱怨,但它没有。我不应该获取数组引用并使用它们进行迭代,而不是在这种情况下使用我演示的方法吗?

1 个答案:

答案 0 :(得分:2)

更新

你在上面的评论中说,子进程关闭了父进程的数据库句柄,所以唯一的问题是为什么没有关于关闭句柄的静止活动语句句柄的消息

这是因为子进程在关闭数据库句柄之前首先关闭语句句柄,因此没有错误报告条件


你没有说你正在使用什么数据库驱动程序,我猜你只是碰巧有一个表现良好的

DBI模块的文档说明了这个

  

对于 某些驱动程序 ,当子进程退出时,对继承句柄的销毁会导致父进程中的相应句柄停止工作。

所以你使用的驱动程序可能不是那些驱动程序之一

另一种方法是连接到数据库的代码设置AutoInactiveDestroy标志。它强制DESTROY方法检查当前PID是否与创建数据库和语句句柄的PID相同,并建议所有新代码的实践