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


93

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

Answers:


38

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

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

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


168

以下错误的说明:

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

如何将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。违规程序将被拒绝建立新的连接。


4
为什么有些人忘记了“;” 在SQL语句之后?进行复制和粘贴拖动:)
codervince

@codervince您必须注意。我几乎可以说您应该抄写命令,而不是复制+粘贴。
AVProgrammer

4

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

11
在finally块中始终关闭连接!否则,如果发生错误,连接将保持打开状态。
tine2k


0

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

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

如果您执行SELECT语句,则需要以这种方式关闭该语句,连接和结果集:

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

我做到了,它奏效了

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.