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)
调试策略
你可以到可能不被释放的连接,找出它是一个程序给不同的用户名/密码,然后查看和pg_stat_activity找出哪一个后本身没有清理.
在无法创建连接时执行完整的异常堆栈跟踪,并按照代码备份到创建新连接的位置Connection,确保创建连接的每个代码行都以connection.close();
如何设置更高的max_connections:
postgresql.conf中的max_connections设置与数据库服务器的最大并发连接数.
SHOW config_file;/var/lib/pgsql/data/postgresql.confmax_connections=100.max_connections的最大值是多少?
使用此查询:
select min_val, max_val from pg_settings where name='max_connections';
Run Code Online (Sandbox Code Playgroud)
从8388607理论上讲,我获得的价值是你获得的最多,但是一个失控的过程可能会占用数千个连接,而且令人惊讶的是,你的数据库在重启之前没有响应.如果你有一个合理的max_connections像100.违规程序将被拒绝一个新的连接.
leo*_*loy 29
我们不知道server.properties文件是什么,我们都不知道SimocoPoolSize是什么意思(对吗?)
我们猜测您正在使用一些自定义数据库连接池.然后,我想问题是你的池配置为打开100或120连接,但你Postgresql服务器配置为接受MaxConnections=90.这些似乎是冲突的设置.尝试增加MaxConnections=120.
但是,您应该首先了解您的数据库层基础结构,知道您正在使用哪个池,如果您确实需要池中的这么多打开的连接.而且,特别是,如果您正在优雅地将打开的连接返回到池中
我在 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)
违规行如下:
MaxConnections=90
InitialConnections=80
Run Code Online (Sandbox Code Playgroud)
您可以增加值以允许更多连接。
小智 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)