繁体   English   中英

使用mod_perl创建新的数据库句柄

[英]Creating new database handles with mod_perl

在对mod_perl进行压力测试时,我遇到了一个问题,即数据库连接将消失。 我怀疑进程正在共享数据库连接,从而导致了问题。

但是我已经遵循了Apache :: DBI的所有说明,因此无法弄清楚。

我在子进程中建立连接,而不是在startup.pl中建立连接。 但是,当我检查每个孩子从DBI-> connnect返回的$ dbh时,每个httpd进程的地址都相同。 首先,如果此方法正常工作并为每个进程重新连接,那么每个子进程的DBI-> connect返回的地址是否应该不同? 我已经假设是这样,但是据我所知,DBI中的核心C代码(dbih_setup_handle)正在管理此操作并返回相同的地址。 因此,也许我不了解在孩子中重新连接意味着什么。

如果$ dbh句柄相同,我是否可以重新正确连接?

听起来您好像在启动配置的<perl>...</perl>部分中,或在启动时加载的模块中建立数据库连接,并保持该状态,直到派生进程尝试使用它为止。

不幸的是,你无法摆脱这个。 您需要以某种方式确保新进程获得新连接。

我对这个问题的解决方案是获得dbh的核心功能,该dbh可以跟踪建立连接时的$$ (当前进程ID)。 如果在移交连接时,该函数发现$$已更改,它将在不关闭任何现有连接的情况下处置任何现有连接,并创建一个新连接:

my $_dbh;
my $pid;

sub dbh {
        if($pid != $$) {
                $_dbh = DBI->connect(...);
                $pid = $$;
        }
        return $_dbh;
}

任何想要使用数据库的代码都将首先调用dbh()来获取数据库句柄,并在必要时让它创建一个新的句柄,或者如果可以使用它,则移交一个先前建立的连接。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM