54

我在项目中使用 PHP 的 PDO 层进行数据访问,我一直在阅读它,发现它对持久性数据库连接具有良好的先天支持。我想知道何时/是否应该使用它们。我会在重 CRUD 的应用程序中看到性能优势吗?是否有缺点需要考虑,可能与安全性有关?

如果这对您很重要,我使用的是 MySQL 5.x。

4

7 回答 7

72

您可以将其用作粗略的“规则集”:

,使用持久连接,如果:

  • 只有少数应用程序/用户访问数据库,即您不会导致 200 个打开(但可能是空闲)连接,因为在同一主机上共享了 200 个不同的用户。
  • 数据库正在您通过网络访问的另一台服务器上运行
  • 一个(一个)应用程序非常频繁地访问数据库

,不要使用持久连接,如果:

  • 您的应用程序每小时只需访问数据库 100 次。
  • 您有许多网络服务器访问一台数据库服务器
  • 您在 prefork 模式下使用 Apache。它为每个子进程使用一个连接,这可以相当快地增加。(通过评论中的@Powerlord)

使用持久连接相当快,尤其是当您通过网络访问数据库时。如果数据库在同一台机器上运行并没有太大区别,但它仍然快一点。然而——顾名思义——连接是持久的,即它保持打开状态,即使它没有被使用。

问题在于,在“默认配置”中,MySQL 只允许 1000 个并行“开放通道”。之后,拒绝新连接(您可以调整此设置)。因此,如果您有 - 比方说 - 20 台 Web 服务器,每台服务器上有 100 个客户端,并且每个服务器每小时只有一个页面访问权限,那么简单的数学将告诉您,您需要 2000 个与数据库的并行连接。那是行不通的。

Ergo:仅用于有大量请求的应用程序。

于 2008-09-09T10:54:49.413 回答
14

简而言之,我的经验表明应尽可能避免持久连接。

请注意,对于使用 mysql_pconnect 创建的连接,mysql_close 是无操作 (no-op)。这意味着客户端不能随意关闭持久连接。当连接上没有任何活动超过wait_timeout时,mysqldb 服务器将关闭此类连接。如果wait_timeout值很大(比如 30 分钟),那么 mysql 数据库服务器可以轻松达到max_connections限制。在这种情况下,mysql db 将不会接受任何未来的连接请求。这是您的寻呼机开始发出哔哔声的时候。

为了避免达到max_connections限制,使用持久连接需要仔细平衡以下变量...

  1. 一台主机上的 apache 进程数
  2. 运行 apache 的主机总数
  3. mysql db服务器中的wait_timout变量
  4. mysql db服务器中的max_connections变量
  5. 一个 apache 进程在重新生成之前服务的请求数

因此,经过充分考虑,请使用持久连接。您可能不想为了从持久连接中获得的小小收益而引发复杂的运行时问题。

于 2010-10-20T13:09:01.770 回答
4

创建与数据库的连接是一项相当昂贵的操作。持久连接是个好主意。在 ASP.Net 和 Java 世界中,我们有“连接池”,这大致相同,也是一个好主意。

于 2008-09-08T18:03:15.773 回答
3

IMO,这个问题的真正答案是最适合您的应用程序。我建议您使用持久连接和非持久连接对您的应用程序进行基准测试。

Maggie Nelson @ Objectively Oriented在 8 月发布了有关此问题的信息,Robert Swarthout也发布了附带的一些硬性数据。两本都很不错的读物。

于 2008-09-08T18:16:39.953 回答
1

在我的愚见:

当使用 PHP 进行 Web 开发时,您的大部分连接将仅在页面执行的生命周期内“存活”。持久连接将花费您很多开销,因为您必须将其放入会话或类似的东西中。

99% 的情况下,在页面执行结束时终止的单个非持久连接可以正常工作。

另外 1% 的时间,您可能不应该在应用程序中使用 PHP,并且没有适合您的完美解决方案。

于 2008-09-09T13:34:55.083 回答
1

通常,您有时需要使用非持久连接,并且最好将单一模式应用于数据库连接设计(只要在您的上下文中使用持久连接的好处相对较小。)

于 2008-11-10T19:09:27.593 回答
0

我本来打算问同样的问题,但我不会再问同样的问题,我只会添加一些我发现的信息。

还值得注意的是,较新的 mysqli 扩展甚至不包括使用持久数据库连接的选项。

我目前仍在使用持久连接,但计划在不久的将来切换到非持久连接。

于 2008-11-10T19:06:22.810 回答