【问题标题】:postgresql php connection limit exceeded for non-superusers非超级用户超出了 postgresql php 连接限制
【发布时间】:2012-02-26 00:33:22
【问题描述】:

我有一个带有 postgresql 后端的 php 应用程序,使用 PDO 与数据库进行交互。它已经启动并运行了几个月没有问题,但今晚突然间我在需要数据库连接的页面加载时遇到持续的 500 错误,服务器的 error.log 文件显示:

PHP Fatal error:  Uncaught exception 'PDOException' with message 'SQLSTATE[08006] 
[7] FATAL:  connection limit exceeded for non-superusers'

连接到数据库的用户的 rollconnlimit 为 -1,因此这应该不是问题。 当我查询 pg_stat_activity 表时,我看不到任何连接。

知道是什么原因造成的吗?我没有更改任何会导致更多或更少数据库连接的代码。

我很高兴发布一些代码,但如果没有关于可能导致问题的原因的指导,我不确定要发布我的代码的哪些部分。

【问题讨论】:

  • 您是否使用持久模式连接? stackoverflow.com/questions/3332074/…
  • 不,我使用的是一次性连接(我被你链接到的答案推迟了持久性!)所以他们应该死了。我已经进行了更多调试,并认为这是我的代码的问题,使用现有的 db 方法来检索每个循环中的单个项目(惰性),而不是仅仅编写一个新的 db 方法,该方法在 THEN 循环时检索记录他们。

标签: php postgresql pdo database-connection


【解决方案1】:

Postgres 错误的直接原因可能是max_connections 的设置。

但是我在你的评论中读到的,你真的应该修复那个。为每条记录都转到数据库,然后在应用程序中本地循环是最坏的情况。

一次检索所有行并在应用程序中处理它们要好得多,但仍然不是很好。您应该尽可能让数据库引擎处理数据,并且只在您的应用程序中检索您需要的结果。这就是数据库引擎擅长的。无需发送大量数据,只实际使用其中的一小部分。我wrote more here

【讨论】:

  • 谢谢欧文,对不起,我在手机上写的太简短了。目前,它使用查询来获取 ID,然后将这些 ID 传递给 php 对象,该对象循环并检索每个 ID 的详细信息。菜鸟失误!我的偏好(以及我将要更改的代码)是修改原始查询以使用第一个(过滤的)查询带回我需要的所有数据,然后遍历结果集以输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-14
  • 2019-03-12
  • 1970-01-01
  • 2016-11-28
  • 2022-07-19
  • 2013-02-12
  • 1970-01-01
相关资源
最近更新 更多