【问题标题】:org.postgresql.util.PSQLException: FATAL: sorry, too many clients alreadyorg.postgresql.util.PSQLException:致命:抱歉,已经有太多客户端
【发布时间】:2011-02-14 23:58:28
【问题描述】:

我正在尝试连接到 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

【问题讨论】:

    标签: java sql postgresql jdbc


    【解决方案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. 在无法创建连接时执行完整的异常堆栈跟踪,并按照代码返回到创建新 Connection 的位置,确保创建连接的每个代码行都以 @987654329 结尾@

    如何将 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 数据库以使更改生效。

    最大连接数是多少?

    使用这个查询:

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

    我得到了8388607 的值,理论上这是您最多可以拥有的值,但是失控的进程可能会占用数千个连接,并且令人惊讶的是,您的数据库在重新启动之前没有响应。如果你有一个合理的 max_connections 像 100。有问题的程序将被拒绝一个新的连接。

    【讨论】:

    • 为什么有些人忘记了';'在 SQL 语句之后?!复制和粘贴拖动:)
    • @codervince 你要注意了。我几乎会说你应该转录命令而不是复制+粘贴。
    • @AVProgrammer 在我的梦想中,我看到了这样一个未来,即距离我们恒星 10 个天文单位以内的每个人都以 root 身份从互联网复制和粘贴代码,并且不用担心意外结果。
    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      无需增加 MaxConnections 和 InitialConnections。完成工作后关闭连接即可。例如,如果您正在创建连接:

      try {
           connection = DriverManager.getConnection(
                          "jdbc:postgresql://127.0.0.1/"+dbname,user,pass);
      
         } catch (SQLException e) {
          e.printStackTrace();
          return;
      }
      

      完成工作后关闭连接:

      try {
          connection.commit();
          connection.close();
      } catch (SQLException e) {
          e.printStackTrace();
      }
      

      【讨论】:

      • 总是在 finally 块中关闭连接!否则,如果发生错误,连接将保持打开状态。
      【解决方案4】:

      有问题的行如下:

      MaxConnections=90
      InitialConnections=80
      

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

      【讨论】:

      • 如果您将允许更多连接,请调整内存参数以适应增加的连接。
      【解决方案5】:

      您需要关闭所有连接,例如: 如果您进行 INSERT INTO 语句,则需要以这种方式关闭语句和您的连接:

      statement.close();
      Connexion.close():
      

      如果你做一个 SELECT 语句,你需要以这种方式关闭语句、连接和结果集:

      resultset.close();
      statement.close();
      Connexion.close();
      

      我这样做了,它成功了

      【讨论】:

        猜你喜欢
        • 2012-12-12
        • 2019-06-18
        • 2020-07-05
        • 1970-01-01
        • 2019-05-21
        • 2018-06-20
        • 2020-01-09
        • 2018-11-29
        相关资源
        最近更新 更多