org.postgresql.util.PSQLException: FATAL: 抱歉,已经有太多的客户端了

2022-08-31 08:13:17

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

Error:org.postgresql.util.PSQLException: FATAL: 抱歉,客户端已经太多了

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

我的文件如下: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

答案 1

以下错误的说明:

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. 在无法创建连接时执行完整的异常堆栈跟踪,并按照代码备份到创建新连接的位置,确保创建连接的每个代码行都以Connectionconnection.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版本的限制。
  8. 重新启动 postgresql 数据库以使更改生效。

最大max_connections是多少?

使用此查询:

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

我得到的值 ,理论上这是你被允许拥有的最多,但是一个失控的进程可能会吞噬成千上万的连接,令人惊讶的是,你的数据库在重新启动之前没有响应。如果你有一个明智的max_connections 100。违规程序将被拒绝建立新连接。8388607


答案 2

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

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

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


推荐