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

lak*_*hmi 74 java sql postgresql jdbc

我试图连接到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
Run Code Online (Sandbox Code Playgroud)

Eri*_*ski 142

以下错误的解释:

org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.
Run Code Online (Sandbox Code Playgroud)

摘要:

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

protected void finalize() throws Throwable  
{  
    try { your_connection.close(); } 
    catch (SQLException e) { 
        e.printStackTrace();
    }
    super.finalize();  
}  
Run Code Online (Sandbox Code Playgroud)

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

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

show max_connections;
Run Code Online (Sandbox Code Playgroud)

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

看看确切的人/什么/何时/在哪里打开您的连接:

SELECT * FROM pg_stat_activity;
Run Code Online (Sandbox Code Playgroud)

当前使用的连接数为:

SELECT COUNT(*) from pg_stat_activity;
Run Code Online (Sandbox Code Playgroud)

调试策略

  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版本的限制.
  8. 重新启动postgresql数据库以使更改生效.

max_connections的最大值是多少?

使用此查询:

select min_val, max_val from pg_settings where name='max_connections';
Run Code Online (Sandbox Code Playgroud)

8388607理论上讲,我获得的价值是你获得的最多,但是一个失控的过程可能会占用数千个连接,而且令人惊讶的是,你的数据库在重启之前没有响应.如果你有一个合理的max_connections像100.违规程序将被拒绝一个新的连接.

  • 为什么有些人会忘记';' 在SQL语句之后?!复制并粘贴拖动:) (4认同)
  • @AVProgrammer 在我的梦想中,我看到了这样一个未来:距离我们恒星 10 个天文单位以内的每个人都可以作为 root 从互联网复制和粘贴代码,并且不用担心出现意外结果。 (2认同)

leo*_*loy 29

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

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

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


Abb*_*bas 9

我在 docker 中安装了 postgres 和其他应用程序。当十多个应用程序连接到 postgres 数据库时,我遇到了这个问题。解决方案是增加 postgres max_connection 计数。默认值为 100。要增加此值,请在 /var/lib/pgsql/data/postgresql.conf 文件中找到 max_connection 并对其进行编辑。另一种方法是添加并运行 docker-compose.yml 文档,如下所示。

version: '3'

services:
  taxi-postgresql:
    container_name: my-postgresql
    image: postgres:13.3
    volumes:
      - ./postgres-volume:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=taxi-postgresql
      - POSTGRES_USER=user
      - POSTGRES_PASSWORD=user
      - POSTGRES_HOST_AUTH_METHOD=trust
    command: postgres -c 'max_connections=1000'
    ports:
      - 127.0.0.1:5432:5432
Run Code Online (Sandbox Code Playgroud)


Del*_*ani 6

违规行如下:

MaxConnections=90
InitialConnections=80
Run Code Online (Sandbox Code Playgroud)

您可以增加值以允许更多连接。

  • 如果您将允许更多连接,请调整内存参数以与增加的连接保持一致。 (5认同)

小智 5

无需增加MaxConnections和InitialConnections.在完成工作后,请关闭您的连接.例如,如果要创建连接:

try {
     connection = DriverManager.getConnection(
                    "jdbc:postgresql://127.0.0.1/"+dbname,user,pass);

   } catch (SQLException e) {
    e.printStackTrace();
    return;
}
Run Code Online (Sandbox Code Playgroud)

完成工作后关闭连接:

try {
    connection.commit();
    connection.close();
} catch (SQLException e) {
    e.printStackTrace();
}
Run Code Online (Sandbox Code Playgroud)

  • 始终关闭finally块中的连接!否则,如果发生错误,连接将保持打开状态. (3认同)