6

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

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

我想知道将数据库连接(我的 $dbh = DBI->connect(etc))放在 FCGI 循环之外是否更好,以便脚本保持连接处于活动状态,或者我仍然可以获得 FCGI 在速度方面的优势和资源,让它留在循环中?

4

4 回答 4

3

bmdhacks 是对的,如果您使用的是 MySQL 或 PostgreSQL,那么它并不重要,因为连接非常便宜。但无论您的数据库如何,您都可以通过使用持久连接获得速度提升。

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

于 2008-10-16T01:43:45.777 回答
2

不要将连接放在循环之外,您可能会失去连接,然后无法重新连接。您可以将其放入全局,但随后您必须进行连接检查并自己重新连接。

相反,请使用Ima::DBIDBI->connect_cached()为您进行连接缓存。它将完成所有工作以确保连接处于活动状态并在必要时重新连接。

但在你费心之前,先做一些基准测试来找出你的瓶颈到底在哪里。过去我曾让数据库连接成为瓶颈,但那是 Oracle 的问题,也是 10 多年前的事了。

于 2008-10-18T08:45:51.367 回答
1

即使您确实将数据库连接保持在循环中,您仍然会从 FCGI 中受益——但如果您将其移出,您将获得更多。

于 2008-10-15T23:29:26.670 回答
1

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

于 2008-10-15T23:55:24.370 回答