org.postgresql.util.PSQLException:对不起,已经有太多客户了

np8igboo  于 2022-11-23  发布在  PostgreSQL
关注(0)|答案(5)|浏览(393)

我正在尝试连接到Postgresql数据库,我收到以下错误:
错误代码:org.postgresql.util.对不起,已经有太多客户了
该错误意味着什么以及如何修复它?
我的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
xytpbqjk

xytpbqjk1#

以下错误的说明:

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以找出哪一个没有在自己之后进行清理。
1.当无法创建连接时,执行完整的异常堆栈跟踪,并按照代码返回到创建新Connection的位置,确保创建连接的每一个代码行都以connection.close();结尾

如何将max_connections设置得更高:

conf中的max_connections设置了到数据库服务器的最大并发连接数。
1.首先找到postgresql.conf文件
1.如果您不知道它在哪里,请使用sql:SHOW config_file;
1.我在:/var/lib/pgsql/data/postgresql.conf
1.以root身份登录并编辑该文件。
1.搜索字符串:“最大连接数”。
1.您将看到一行max_connections=100
1.将该数字设置得更大,重新启动postgresql数据库。

最大max_connections是多少?

使用此查询:

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

我得到的值是8388607,所以理论上这是允许的最大值,但是一个失控的进程可能会消耗掉数千个连接,令人惊讶的是,数据库直到重新启动才有响应。如果你有一个合理的max_connections,比如100,那么违规的程序将被拒绝建立新的连接,数据库是安全的。

axkjgtzd

axkjgtzd2#

我们不知道 * server.properties * 文件是什么,也不知道 SimocoPoolSize 是什么意思(您知道吗?)
假设您使用的是某个自定义的数据库连接池。那么,我猜问题是您的连接池被配置为打开100或120个连接,而Postgresql服务器被配置为接受MaxConnections=90。这些设置似乎是冲突的。请尝试增加MaxConnections=120
但是,如果您确实需要在池中使用这么多打开的连接,尤其是如果您要将打开的连接正常地返回到池中,那么您应该首先了解您的数据库层基础结构,知道您使用的是什么池

8zzbczxx

8zzbczxx3#

不需要增加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();
}
tvmytwxo

tvmytwxo4#

有问题的行如下:

MaxConnections=90
InitialConnections=80

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

pinkon5k

pinkon5k5#

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

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

如果你使用SELECT语句,你需要关闭语句、连接和结果集,方法如下:

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

我这么做了,而且成功了

相关问题