org.postgresql.util.PSQLException:致命:抱歉,已经有太多客户

新手上路,请多包涵

我正在尝试连接到 Postgresql 数据库,但出现以下错误:

错误:org.postgresql.util.PSQLException:致命:抱歉,已经有太多客户端

该错误是什么意思,我该如何解决?

我的 server.properties 文件如下:

 serverPortData=9042
serverPortCommand=9078
trackConnectionURL=jdbc:postgresql://127.0.0.1:5432/vTrack?user=postgres password=postgres
dst=1
DatabaseName=vTrack
ServerName=127.0.0.1
User=postgres
Password=admin
MaxConnections=90
InitialConnections=80
PoolSize=100
MaxPoolSize=100
KeepAliveTime=100
TrackPoolSize=120
TrackMaxPoolSize=120
TrackKeepAliveTime=100
PortNumber=5432
Logging=1

原文由 lakshmi 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2.6k
2 个回答

我们不知道 server.properties 文件是什么,我们也不知道 SimocoPoolSize 是什么意思(是吗?)

假设您正在使用一些自定义的数据库连接池。然后,我想问题是您的池配置为打开 100 或 120 个连接,但您的 Postgresql 服务器配置为接受 MaxConnections=90 。这些似乎是相互矛盾的设置。尝试增加 MaxConnections=120

但是你应该首先了解你的数据库层基础设施,知道你使用的是什么池,如果你真的需要在池中打开这么多连接。而且,特别是,如果您优雅地将打开的连接返回到池中

原文由 leonbloy 发布,翻译遵循 CC BY-SA 2.5 许可协议

以下错误的解释:

 org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.

概括:

您打开的数据库连接数超过了允许的限制。你运行了这样的东西: Connection conn = myconn.Open(); 在循环内,忘记运行 conn.close(); 。仅仅因为您的类被销毁并且垃圾被收集并不会释放与数据库的连接。最快的解决方法是确保您拥有以下代码以及创建连接的任何类:

 protected void finalize() throws Throwable
{
    try { your_connection.close(); }
    catch (SQLException e) {
        e.printStackTrace();
    }
    super.finalize();
}

将该代码放在您创建连接的任何类中。然后当你的类被垃圾收集时,你的连接将被释放。

运行此 SQL 以查看允许的 postgresql 最大连接数:

 show max_connections;

默认值为 100。良好硬件上的 PostgreSQL 一次可以支持几百个连接。如果你想要有数千个,你应该考虑使用连接池软件来减少连接开销。

看看究竟是谁/什么/何时/何地打开了你的连接:

 SELECT * FROM pg_stat_activity;

当前使用的连接数为:

 SELECT COUNT(*) from pg_stat_activity;

调试策略

  1. 您可以为可能不会释放连接的程序提供不同的用户名/密码以找出它是哪一个,然后查看 pg_stat_activity 以找出哪个程序没有自行清理。

  2. 当无法创建连接时执行完整的异常堆栈跟踪,并按照代码返回到创建新的 Connection 的位置,确保创建连接的每个代码行都以 connection.close();

如何将 max_connections 设置得更高:

postgresql.conf 中的 max_connections 设置与数据库服务器的最大并发连接数。

  1. 首先找到你的 postgresql.conf 文件
  2. 如果你不知道它在哪里,用sql查询数据库: SHOW config_file;
  3. 我的在: /var/lib/pgsql/data/postgresql.conf
  4. 以 root 身份登录并编辑该文件。
  5. 搜索字符串:“max_connections”。
  6. 您会看到一行内容为 max_connections=100
  7. 将该数字设置得更大,重新启动 postgresql 数据库。

max_connections 的最大值是多少?

使用此查询:

 select min_val, max_val from pg_settings where name='max_connections';

我得到了值 8388607 所以理论上这是你被允许拥有的最多值,但是一个失控的进程可以吃掉数千个连接,而且令人惊讶的是,你的数据库在重新启动之前没有响应。如果你有一个像 100 这样合理的 max_connections。违规程序将被拒绝新连接并且数据库是 safu。

原文由 Eric Leschinski 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题