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

时间:2010-05-03 11:01:13

标签: 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

6 个答案:

答案 0 :(得分:129)

以下错误的解释:

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();  
}  

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

运行此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();

  3. 如何设置更高的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数据库以使更改生效。
    9. max_connections的最大值是多少?

      使用此查询:

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

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

答案 1 :(得分:27)

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

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

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

答案 2 :(得分:5)

无需增加MaxConnections&amp; 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();
}

答案 3 :(得分:0)

违规行如下:

MaxConnections=90
InitialConnections=80

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

答案 4 :(得分:0)

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

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

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

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

我做了这个并且有效

答案 5 :(得分:0)

所有您需要做的就是在需要时在方法中调用连接,并在完成后在同一方法中关闭连接,这样就不会留下任何打开但没有使用的连接。我的示例java.class连接到我的数据库:

    package test;

    import java.sql.Connection;
    import java.sql.DriverManager;
    import java.sql.SQLException;
    import javax.swing.JOptionPane;

    public class JCONNECT {

        public static Connection CONN(){
                try {        
                    Class.forName("org.postgresql.Driver");
                    Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/db","postgres","test");
                    return conn; 
                }
                catch(ClassNotFoundException | SQLException e){
                    JOptionPane.showMessageDialog(null,"FAILED TO CONNECT TO SERVER 04/n"+e,"CONNECTION FAILURE!",JOptionPane.WARNING_MESSAGE );
                    return null;
                }
            }
   }

我使用的方法

public void OUTPUT(){
        try{
            Connection CONN = JCONNECT.CONN();

           //======================================
           //codes here*******************************
           //======================================

           CONN.close();

           }catch(Exception E){JOptionPane.showMessageDialog(null, E);}
 }