以下错误的说明:
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();
}
将该代码放在创建连接的任何类中。然后,当您的类被垃圾回收时,您的连接将被释放。
运行此 SQL 以查看允许的 postgresql 最大连接数:
show max_connections;
默认值为 100。良好硬件上的PostgreSQL可以一次支持几百个连接。如果要拥有数千个,则应考虑使用连接池软件来减少连接开销。
看看究竟是谁/什么/何时/何地打开了你的连接:
SELECT * FROM pg_stat_activity;
当前使用的连接数为:
SELECT COUNT(*) from pg_stat_activity;
调试策略
您可以为可能没有释放连接的程序提供不同的用户名/密码,以找出它是哪一个,然后在pg_stat_activity中查找,找出哪一个没有自行清理。
在无法创建连接时执行完整的异常堆栈跟踪,并按照代码备份到创建新连接的位置,确保创建连接的每个代码行都以Connection
connection.close();
如何将max_connections设置得更高:
postgresql.conf 中的max_connections设置与数据库服务器的最大并发连接数。
- 首先找到您的 postgresql.conf 文件
- 如果您不知道它在哪里,请使用 sql 查询数据库:
SHOW config_file;
- 我的在:
/var/lib/pgsql/data/postgresql.conf
- 以 root 用户身份登录并编辑该文件。
- 搜索字符串:“max_connections”。
- 您将看到一行,上面写着 .
max_connections=100
- 将该数字设置得更大,请检查您的postgresql版本的限制。
- 重新启动 postgresql 数据库以使更改生效。
最大max_connections是多少?
使用此查询:
select min_val, max_val from pg_settings where name='max_connections';
我得到的值 ,理论上这是你被允许拥有的最多,但是一个失控的进程可能会吞噬成千上万的连接,令人惊讶的是,你的数据库在重新启动之前没有响应。如果你有一个明智的max_connections 100。违规程序将被拒绝建立新连接。8388607