例外: FATAL: 对不起,已经有太多客户端了

我正在尝试连接到一个 Postgreql 数据库,我得到以下错误:

错误: org.postgreql.util.PSQLException: FATAL: 对不起,已经有太多客户端了

这个错误是什么意思? 我如何修复它?

我的 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
305372 次浏览

违规行为如下:

MaxConnections=90
InitialConnections=80

可以增加值以允许更多连接。

我们不知道 Server.properties文件是什么,我们也不知道 SimocoPoolSize是什么意思(你知道吗?)

让我们假设您正在使用一些自定义的数据库连接池。然后,我猜测问题在于您的池被配置为打开100或120个连接,而 Postgreql 服务器被配置为接受 MaxConnections=90。这些设置似乎有些冲突。试着增加 MaxConnections=120

但是,如果您确实需要在池中使用如此多的开放连接,那么首先应该了解您的数据库层基础结构,知道您正在使用什么池。特别是,如果您正在优雅地返回打开的到池的连接

不需要增加 MaxConnections 和 InitialConnections。做完工作之后,关闭你的联系。例如,如果您正在创建连接:

try {
connection = DriverManager.getConnection(
"jdbc:postgresql://127.0.0.1/"+dbname,user,pass);


} catch (SQLException e) {
e.printStackTrace();
return;
}

完成工作后,密切联系:

try {
connection.commit();
connection.close();
} catch (SQLException e) {
e.printStackTrace();
}

对以下错误的解释:

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 查看 postgreql max 连接是否允许:

show max_connections;

默认值是100。PostgreSQL 在好的硬件上一次可以支持几百个连接。如果希望有数千个连接,则应考虑使用连接池软件来减少连接开销。

看看到底是谁/什么/什么时候/在什么地方开放了你的联系:

SELECT * FROM pg_stat_activity;

当前使用的连接数是:

SELECT COUNT(*) from pg_stat_activity;

调试策略

  1. 您可以为那些可能没有释放连接的程序提供不同的用户名/密码,以找出是哪个用户名/密码,然后查看 pg _ stat _ activity 以找出哪个用户名/密码没有自己清理。

  2. 在无法创建连接时执行完整的异常堆栈跟踪,并按照代码返回到创建新 Connection的位置,确保创建连接的每一行代码都以 connection.close();结束

如何将 max _ connect 设置得更高:

Conf 中的 max _ connect 设置到数据库服务器的最大并发连接数。

  1. 首先找到 postgreql.conf 文件
  2. 如果不知道它在哪里,可以使用 sql: SHOW config_file;查询数据库
  3. 我的是 /var/lib/pgsql/data/postgresql.conf
  4. 以 root 身份登录并编辑该文件。
  5. 搜索字符串: “ max _ links”。
  6. 你会看到一条写着 max_connections=100的线。
  7. 将这个数字设置为更大,重新启动 postgreql 数据库。

最大最大连接数是多少?

使用以下查询:

select min_val, max_val from pg_settings where name='max_connections';

我得到了 8388607的值,所以理论上这是你能得到的最大值,但是一个失控的进程会吞噬掉成千上万的连接,令人惊讶的是,你的数据库在重启之前没有响应。如果你有一个像100这样合理的最大连接。违规程序将被拒绝一个新的连接和数据库是 safu。

你需要关闭所有的连接,例如: 如果创建 INSERT INTO 语句,则需要以这种方式关闭语句和连接:

statement.close();
Connexion.close():

如果你创建一个 SELECT 语句,你需要以这种方式关闭语句、连接和结果集:

resultset.close();
statement.close();
Connexion.close();

我做到了,而且成功了

我在 Docker 有 Postgres 和其他应用程序。当十多个应用程序连接到 postgres 数据库时,我正面临着这个问题。解决方案是增加最大连接数。默认值是100。要增加这个值,可以在/var/lib/pgsql/data/postgreql.conf 文件中找到 max _ connect 并编辑它。另一种方法是添加和运行 docker-compose。Yml 文档如下所示。

version: '3'


services:
taxi-postgresql:
container_name: my-postgresql
image: postgres:13.3
volumes:
- ./postgres-volume:/var/lib/postgresql/data
environment:
- POSTGRES_DB=taxi-postgresql
- POSTGRES_USER=user
- POSTGRES_PASSWORD=user
- POSTGRES_HOST_AUTH_METHOD=trust
command: postgres -c 'max_connections=1000'
ports:
- 127.0.0.1:5432:5432