以下错误的解释:
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 的位置,确保创建连接的每个代码行都以 @987654329 结尾@
如何将 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 数据库以使更改生效。
最大连接数是多少?
使用这个查询:
select min_val, max_val from pg_settings where name='max_connections';
我得到了8388607 的值,理论上这是您最多可以拥有的值,但是失控的进程可能会占用数千个连接,并且令人惊讶的是,您的数据库在重新启动之前没有响应。如果你有一个合理的 max_connections 像 100。有问题的程序将被拒绝一个新的连接。