假设我有一些Perl代码,它在每次命中数据库的特定行时递增一列,并且我希望它被频繁命中,所以我想使用FCGI对其进行优化。现在,我基本上将大部分代码包装在这样的东西中:
while (FCGI::accept() >= 0) {
[code which currently creates a db connection and makes calls through it]
}我想知道是不是把数据库连接(我的$dbh =DBI->connect(等))放在FCGI循环之外,这样脚本就可以保持连接的活动状态,或者我仍然可以通过把它留在循环中来获得FCGI在速度和资源方面的优势?
发布于 2008-10-16 01:43:46
bmdhacks是正确的,如果你使用MySQL或PostgreSQL,这并不重要,因为连接相当便宜。但是,无论您的数据库是什么,您都可以通过使用持久连接获得速度上的提升。
但是,如果您决定使用持久连接,则需要担心连接超时。根据你的服务器设置和你得到的流量,这些都会在你的程序生命周期中的任何时候发生。ping()是你的朋友。如果你需要更多的帮助,看看Apache::DBI是如何做到的。
发布于 2008-10-18 08:45:51
不要把连接放在循环之外,你可能会失去连接,然后就不能重新连接了。您可以将其放入全局,但然后您必须执行连接检查,然后自己重新连接。
相反,可以使用Ima::DBI或DBI->connect_cached()为您执行连接缓存。它将做所有的工作,以确保连接是活动的,并在必要时重新连接。
但在你费心之前,先做一些基准测试,找出你真正的瓶颈在哪里。在过去,数据库连接是瓶颈,但那是在Oracle上,几年前也是10+。
发布于 2008-10-15 23:29:27
即使你将DB连接保留在循环中,你仍然可以从FCGI中获益--但如果你把它移出,你会得到更多。
https://stackoverflow.com/questions/206885
复制相似问题