org.postgresql.util.PSQLException:致命:对不起,已经有太多的客户端了
我正在尝试连接到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
我们不知道server.properties文件是什么,我们也不知道SimocoPoolSize是什么意思(是吗?
我们猜测你正在使用一些自定义的数据库连接池。 然后,我猜问题是你的池被configuration为打开100或120个连接,但是你的Postgresql服务器被configuration为接受MaxConnections=90
。 这似乎是有冲突的设置。 尝试增加MaxConnections=120
。
但是,你应该首先了解你的数据库层的基础设施,知道你在使用什么池,如果你真的需要在池中这么多的开放连接。 特别是,如果您正在优雅地将打开的连接返回到池中
对以下错误的解释:
org.postgresql.util.PSQLException: FATAL: sorry, too many clients already.
概要:
您打开的连接数量超过了允许的限制。 你跑这样的东西: Connection conn = myconn.Open();
在一个循环内,忘了运行conn.close();
。 只是因为你的类被销毁,垃圾收集不会释放到数据库的连接。 最快的解决方法是确保你有任何类创build连接的代码如下:
protected void finalize() throws Throwable { try { your_connection.close(); } catch (SQLException e) { e.printStackTrace(); } super.finalize(); }
将该代码放置在创build连接的任何类中。 那么当你的class级被垃圾收集后,你的连接就会被释放。
运行这个SQL来查看允许的postgresql max连接:
show max_connections;
默认值是100.好硬件上的PostgreSQL一次可以支持几百个连接。 如果你想拥有数千个,你应该考虑使用连接池软件来减less连接开销。
看看究竟是谁/什么/什么时候/在哪里举行打开你的连接:
SELECT * FROM pg_stat_activity;
目前使用的连接数量是:
SELECT COUNT(*) from pg_stat_activity;
debugging策略
-
你可以给不同的用户名/密码的程序,可能不会释放连接,找出它是哪一个,然后查看pg_stat_activity找出哪一个没有清理自己。
-
当无法创build连接时,执行一个完整的exception堆栈跟踪,并将代码返回到创build新
Connection
,确保每个创build连接的代码行都以connection.close();
结束connection.close();
如何设置max_connections更高:
postgresql.conf中的max_connections设置数据库服务器的最大并发连接数。
- 首先find你的postgresql.conf文件
- 如果你不知道它在哪里,用sql:
SHOW config_file;
查询数据库SHOW config_file;
- 我在:
/var/lib/pgsql/data/postgresql.conf
- 以root身份login并编辑该文件。
- searchstring:“max_connections”。
- 你会看到一行说
max_connections=100
。 - 设置这个数字更大,检查你的postgresql版本的限制。
- 重新启动postgresql数据库以使更改生效。
什么是最大的max_connections?
使用这个查询:
select min_val, max_val from pg_settings where name='max_connections';
我得到的值是8388607
,理论上这是你允许的最多的,但是一个失控的进程可能会吃掉数千个连接,而且惊奇的是,你的数据库在重启之前是没有响应的。 如果你有一个明智的max_connections像100.违规程序将被拒绝一个新的连接。
不需要增加MaxConnections和InitialConnections。 在完成工作之后closures你的联系。 例如,如果您正在创build连接:
try { connection = DriverManager.getConnection( "jdbc:postgresql://127.0.0.1/"+dbname,user,pass); } catch (SQLException e) { e.printStackTrace(); return; }
在你的工作之后closures连接:
try { connection.commit(); connection.close(); } catch (SQLException e) { e.printStackTrace(); }
有问题的路线如下:
MaxConnections=90 InitialConnections=80
您可以增加值以允许更多的连接。
例如,您需要closures所有连接:如果您创buildINSERT INTO语句,则需要以这种方式closures语句和连接:
statement.close(); Connexion.close():
如果你创build一个SELECT语句,你需要以这种方式closures语句,连接和结果集:
resultset.close(); statement.close(); Connexion.close();
我做到了这一点,它的工作
1.检查当前configuration
使用psql命令login到PostgreSQL,
postgres=# show max_connections; max_connections ----------------- 100 (1 row)
2.打开PostgreSQLconfiguration文件
vi /var/lib/pgsql/data/postgresql.conf
3.相应地更改以下默认configuration
max_connections = 100 # (change requires restart) # Note: Increasing max_connections costs ~400 bytes of shared memory per .... shared_buffers = 400MB # min 128kB # (change requires restart)
4.重新启动PostgreSQL服务器以应用更改
$:service postgresql restart Stopping postgresql service: [ OK ] Starting postgresql service: [ OK ]
参考
http://www.devdummy.com/2017/10/postgresql-psqlexception-fatal-sorry.html