Mysql 我是否必须将DB连接/初始化置于FCGI循环之外才能利用Perl中的FastCGI?

Mysql 我是否必须将DB连接/初始化置于FCGI循环之外才能利用Perl中的FastCGI?,mysql,perl,fastcgi,Mysql,Perl,Fastcgi,假设我有一些Perl代码,每次命中数据库特定行中的一列时,它都会递增,我希望它会被频繁地命中,所以我想用FCGI对它进行优化。现在,我基本上把大部分代码包装成这样: while (FCGI::accept() >= 0) { [code which currently creates a db connection and makes calls through it] } 我想知道是否最好将数据库连接(my$dbh=DBI->connect(etc))置于FCGI循环之外,以便脚本保

假设我有一些Perl代码,每次命中数据库特定行中的一列时,它都会递增,我希望它会被频繁地命中,所以我想用FCGI对它进行优化。现在,我基本上把大部分代码包装成这样:

while (FCGI::accept() >= 0) {
 [code which currently creates a db connection and makes calls through it]
}

我想知道是否最好将数据库连接(my$dbh=DBI->connect(etc))置于FCGI循环之外,以便脚本保持连接的活动性,或者我还是会通过将FCGI保留在循环中来获得FCGI在速度和资源方面的优势?

即使您将DB连接保留在循环中,您仍然会从FCGI中获得好处-但如果您将其移出,您将获得更多好处。

连接性能在很大程度上取决于您使用的数据库。PostgreSQL和MySQL的连接速度非常快(尤其是MySQL),因此通常会在每次请求时进行连接。其他数据库(如Oracle)的速度稍慢,并且往往需要更长的连接寿命。通过使用DBI->connect()编写一个while 1..100000循环并断开连接,可以很容易地测试数据库的速度。

bmdhacks是正确的,如果您使用的是MySQL或PostgreSQL,这并不重要,因为连接非常便宜。但无论您的数据库如何,通过使用持久连接,您都将获得速度增益


但是,如果您决定使用持久连接,则需要担心连接超时。这些情况将在程序生命周期内的任何时间发生,具体取决于服务器设置和获得的流量
ping()
是您的朋友。如果您需要更多帮助,请查看Apache::DBI是如何做到的。

不要将连接置于循环之外,您可能会丢失连接,然后无法重新连接。你可以把它放进一个全局,但是你必须做连接检查,然后自己重新连接

相反,请使用或为您执行连接缓存。它将完成所有工作以确保连接处于活动状态,并在必要时重新连接

但在你烦恼之前,做一些基准测试来找出你的瓶颈到底在哪里。过去,数据库连接一直是我的瓶颈,但那是Oracle的瓶颈,也是10多年前的瓶颈