以下错误的说明:
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();
}
将该代码放在创建Connection的任何类中。然后,当您的班级被垃圾回收时,您的连接将被释放。
运行以下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数据库,以使更改生效。
最大的最大连接数是多少?
使用此查询:
select min_val, max_val from pg_settings where name='max_connections';
我得到了价值8388607
,理论上这是您被允许拥有的最大价值,但是一个失控的进程可能会吞噬成千上万个连接,并且令人惊讶的是,您的数据库直到重新启动才响应。如果您有一个明智的max_connections,例如100。违规程序将被拒绝建立新的连接。