首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Fork+DBI和语句句柄

Fork+DBI和语句句柄
EN

Stack Overflow用户
提问于 2016-08-31 08:16:54
回答 1查看 815关注 0票数 1

情况

因此,我知道连接是跨进程共享的,我不能使用在子进程的分叉之前打开的连接。

我还知道,当我尝试这样做时,perl会抱怨:

代码语言:javascript
复制
my $sth = $dbConn->prepare($sql);
$sth->execute();
$dbConn->disconnect();
while(my @row = $sth->fetchrow_array){
    print @row,"\n";
}

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

为什么这样做呢?

代码语言:javascript
复制
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不应该抱怨语句句柄仍然处于活动状态吗?我还确保在循环完全迭代之前已经完成了某些进程的执行,并认为它可能会在那时抱怨,但它没有。我是不是应该获取数组引用并使用它们来迭代,而不是我在这个场景中演示的方法呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-08-31 09:00:48

更新

您在上面的注释中说,子进程确实关闭了父进程的数据库句柄,因此唯一的问题是,为什么没有关于与句柄关闭相关的静态活动语句句柄的消息?

这是因为子进程在关闭数据库句柄之前也将首先在终止时关闭语句句柄,因此不存在要报告的错误条件。

你没有说你使用的是什么数据库驱动程序,我猜你只是碰巧有一个行为良好的驱动程序。

DBI模块的文档说明如下

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

所以也许你使用的驱动不是那种驱动程序

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39244223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档