情况
因此,我知道连接是跨进程共享的,我不能使用在子进程的分叉之前打开的连接。
我还知道,当我尝试这样做时,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不应该抱怨语句句柄仍然处于活动状态吗?我还确保在循环完全迭代之前已经完成了某些进程的执行,并认为它可能会在那时抱怨,但它没有。我是不是应该获取数组引用并使用它们来迭代,而不是我在这个场景中演示的方法呢?
发布于 2016-08-31 09:00:48
更新
您在上面的注释中说,子进程确实关闭了父进程的数据库句柄,因此唯一的问题是,为什么没有关于与句柄关闭相关的静态活动语句句柄的消息?
这是因为子进程在关闭数据库句柄之前也将首先在终止时关闭语句句柄,因此不存在要报告的错误条件。
你没有说你使用的是什么数据库驱动程序,我猜你只是碰巧有一个行为良好的驱动程序。
DBI模块的文档说明如下
对于,当子进程退出继承句柄时,某些驱动程序会导致父进程中相应的句柄停止工作。
所以也许你使用的驱动不是那种驱动程序
另一种方法是连接到数据库的代码设置AutoInactiveDestroy标志。它强制DESTROY方法检查当前PID是否与创建数据库和语句句柄的PID相同,并建议对所有新代码进行实践。
https://stackoverflow.com/questions/39244223
复制相似问题