2008-09-08 63 views
42

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

如果对你很重要,我使用MySQL 5.x.

回答

58

您可以使用此作为一个粗略的“规则集”:

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

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

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

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

使用持久连接速度要快得多,特别是在通过网络访问数据库时。如果数据库运行在同一台机器上,它并没有太大的区别,但速度还是比较快。但是 - 正如名称所述 - 连接是持久的,即保持打开状态,即使未使用。

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

错误:只能用于有很多请求的应用程序。

+1

另外,如果您在prefork模式下使用Apache,请勿使用持久连接。它为每个子进程使用一个连接,可以相当快速地进行。 – Powerlord 2008-11-10 19:28:49

+0

@BlaM,我没有得到你的最后一段。是否持久连接允许您重用它们(这就是整个重点?),所以您不需要2000个连接,因为它们将被重用?或者你的意思是**每个客户**都有一个唯一的用户名?即便如此,当旧连接连接完成后,新连接将不会自动关闭? – Pacerier 2015-06-25 07:01:28

4

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

3

IMO,这个问题的真正答案是任何最适合你的应用程序。我建议你使用持久连接和非持久连接来测试你的应用程序。

Maggie Nelson @Objectively Oriented在八月份发布了此消息,Robert Swarthout发表了一些带有硬编号的附带帖子。这两个都很不错。

+2

“客观导向”链接已关闭。 – Pacerier 2015-06-25 07:23:37

+1

我不喜欢这个答案,因为基准测试通常是以非常不准确的方式完成的。您的计算机在“除真实世界访问模式之外”(这是典型的测试)访问它时,它可能看起来非常好。时间安排非常重要,正如现实生活中经常发生的其他一些“难以复制”的情况一样。除非你肯定会需要它,否则我会建议你仔细考虑并避免它。预优化是第一个罪。 – 2016-06-15 16:16:48

0

在我的愚见:

当使用PHP的Web开发,大部分的连接将只“活”的页面的生命执行。持续的连接会花费你很多的开销,因为你必须把它放在会话或某些事情中。

99%的时间在页面执行结束时死亡的单个非持续性连接将工作得很好。

其他1%的时间,你可能不应该使用PHP的应用程序,并没有完美的解决方案。

0

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

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

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

0

一般来说,有时候需要使用非持久连接,并且很有必要将单个模式应用于db连接设计(只要在您的上下文中使用持久连接的可能性相对较小)。

9

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

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

为了避免达到max_connections的,使用持久连接需要以下变量小心平衡...

1. Number of apache processes on one host 
2. Total number of hosts running apache 
3. wait_timout variable in mysql db server 
4. max_connections variable in mysql db server 
5. Number of requests served by one apache process before it is re-spawned 

所以,PL使用足够的审议后永久连接。您可能不想邀请复杂的运行时问题,以获得持久连接的小增益。