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

Bri*_*haw 46 persistence pdo database-connection

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

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

Bla*_*laM 63

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

,使用持久连接,如果:

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

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

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

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

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

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

  • 此外,如果您在prefork模式下使用Apache,请不要使用持久连接.它为每个子进程使用一个连接,可以相当快地增加. (2认同)

Lio*_*art 9

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

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

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

__PRE__

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

  • “mysql_close 是使用 mysql_pconnect 创建的连接的无操作(无操作)”所需的引用。对于 mysqli,它当然不是空操作:http://php.net/manual/en/mysqli.persistconns.php (2认同)