持久数据库连接 - 是或否?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了持久数据库连接 - 是或否?相关的知识,希望对你有一定的参考价值。

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

如果对你很重要,我正在使用mysql 5.x.

答案

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

是,使用持久连接,如果:

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

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

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

使用持久连接的速度要快得多,尤其是在通过网络访问数据库时。如果数据库在同一台机器上运行,它没有太大的区别,但它仍然快一点。然而 - 正如名称所说 - 连接是持久的,即它保持打开,即使它没有被使用。

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

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

另一答案

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

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

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

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

因此,经过充分考虑后,pl使用持久连接。您可能不希望为持久连接获得的小增益邀请复杂的运行时问题。

另一答案

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

另一答案

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

Maggie Nelson @ Objectively Oriented在8月份发布了这个消息,Robert Swarthout发布了一些附带一些硬数字的帖子。两者都是相当不错的读物。

另一答案

在我的愚见:

当使用PHP进行Web开发时,大多数连接只会在页面执行期间“生效”。持久连接会花费你很多开销,因为你必须把它放在会话中或者某些东西上。

99%的时间在页面执行结束时死亡的单个非持久连接将正常工作。

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

另一答案

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

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

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

另一答案

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

以上是关于持久数据库连接 - 是或否?的主要内容,如果未能解决你的问题,请参考以下文章

如何将输出作为是或否而不是阈值?

JOptionPane 是或否窗口

尾部斜线:是或否? [复制]

sh 问是或否

C++ 抽象类:构造函数是或否?

在C#中使用SQL语句查询数据在表中是不是存在输出是或否