假设我有一些Perl代码,每当它被命中时,它会增加数据库特定行中的列,并且我希望它经常被命中,所以我想用FCGI对它进行优化。现在,我基本上把大部分代码包装成这样的东西:
while (FCGI::accept() >= 0) {
[code which currently creates a db connection and makes calls through it]
}
我想知道将数据库连接(我的$ dbh = DBI-> connect(etc))放在FCGI循环之外是否更好,以便脚本保持连接存活,或者我仍然可以获得优势FCGI的速度和速度将它留在循环中的资源?
答案 0 :(得分:3)
bmdhacks是正确的,如果你使用MySQL或PostgreSQL它并不重要,因为连接相当便宜。但无论您使用数据库,都可以通过使用持久连接来提高速度。
但是如果您决定使用持久连接,则需要担心连接超时。这些将在您的程序生命周期的任何时间发生,具体取决于您的服务器设置和您获得的流量。 ping()
是你的朋友。如果您需要更多帮助,请查看Apache::DBI
如何做到这一点。
答案 1 :(得分:2)
不要将连接放在循环外,可能会丢失连接,然后无法重新连接。你可以把它放到全局,但是你必须进行连接检查并重新连接。
相反,请使用Ima::DBI或DBI->connect_cached()
为您执行连接缓存。它将完成所有工作以确保连接处于活动状态并在必要时重新连接。
但是在你打扰之前,做一些基准测试以找出你的瓶颈所在。我过去曾将数据库连接作为瓶颈,但那是在Oracle,而且也是10年以前。
答案 2 :(得分:1)
即使您将数据库连接保持在循环中,您仍然可以从FCGI获益 - 但如果您将其移出,您将获得更多收益。
答案 3 :(得分:1)
连接性能在很大程度上取决于您使用的数据库。 PostgreSQL和MySQL的连接速度非常快(尤其是MySQL),因此通常可以连接每个请求。其他数据库(如Oracle)速度稍慢,往往需要更长的连接生命周期。通过使用DBI-> connect()编写一个1..100000循环并断开连接以查看数据库的速度,可以很容易地进行测试。