【问题标题】:How to refresh pooled PDO connections by PHP?如何通过 PHP 刷新池 PDO 连接?
【发布时间】:2013-10-08 14:13:52
【问题描述】:

我正在使用 PDO 连接到 Postgresql 数据库,使用 PDO::ATTR_PERSISTENT 属性可以显着加快应用程序的速度。

但是我遇到了一个问题,经过调试,发现在最后一个SQL查询执行后大约2小时11分钟后,与DB的连接就死了! 故障出在服务器之间的防火墙上,但是网络人员拒绝将限制设置为高于 24 小时(说这会减慢防火墙速度),而我需要禁用它。

我无法通过简单的使用来刷新池连接,因为我无法控制或确保所有池连接都在一个旋转的基础上提供服务,确保没有连接会死(导致稍后在服务器上有负载时难以调试问题,并且一些连接已死,而另一些连接还活着)。

那么,有人对这个问题有什么建议吗?除了强制网络人员为这两个特定服务器禁用这个愚蠢的超时规则之外,如何保持池连接处于活动状态?

谢谢!

【问题讨论】:

  • 我完全不明白这个问题。死连接有什么问题?你说的是在线脚本,还是某种恶魔,永久连接到数据库?
  • @YourCommonSense 了解持久连接php.net/manual/en/pdo.connections.php
  • @Marek 好的,我读到了。下一步是什么?你能回答我问 OP 的问题吗?
  • @YourCommonSense OP 解释得很好。 Postgresql 有一个连接池(TCP/IP 连接)。如果一个连接超过 2 小时没有使用,它就会从防火墙的表中删除,它是死的。在使用连接之前,客户端不会意识到这一点,因此客户端有责任处理这种情况并重新连接。

标签: php pdo database-connection connection-pooling php-pgsql


【解决方案1】:

使用

SELECT 1

作为第一个查询,如果失败,则重新连接。

【讨论】:

  • 我无法重新连接,因为连接是资源池给脚本的。池根本不知道连接已死,即使在尝试任何 SQL 语句之后 - 下一次执行仍然会产生错误。除了重启 apache 之外,我没有找到其他方法来解决这个问题。
  • 如果 $con 是您拥有的连接,在捕获错误后,分配给 $con 新的 PDO 对象。那应该重新打开连接。我现在验证了它,但仅适用于定期终止的连接。您也可以在创建新 PDO 之前尝试 $con = null。
猜你喜欢
  • 1970-01-01
  • 2021-05-26
  • 1970-01-01
  • 2013-12-08
  • 2011-08-22
  • 2020-08-10
  • 2015-11-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多