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策略

  1. 你可以给不同的用户名/密码的程序,可能不会释放连接,找出它是哪一个,然后查看pg_stat_activity找出哪一个没有清理自己。

  2. 当无法创build连接时,执行一个完整的exception堆栈跟踪,并将代码返回到创build新Connection ,确保每个创build连接的代码行都以connection.close();结束connection.close();

如何设置max_connections更高:

postgresql.conf中的max_connections设置数据库服务器的最大并发连接数。

  1. 首先find你的postgresql.conf文件
  2. 如果你不知道它在哪里,用sql: SHOW config_file;查询数据库SHOW config_file;
  3. 我在: /var/lib/pgsql/data/postgresql.conf
  4. 以root身份login并编辑该文件。
  5. searchstring:“max_connections”。
  6. 你会看到一行说max_connections=100
  7. 设置这个数字更大,检查你的postgresql版本的限制。
  8. 重新启动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