spring boot postgres:致命:对不起,已经有太多客户了

Posted

技术标签:

【中文标题】spring boot postgres:致命:对不起,已经有太多客户了【英文标题】:spring boot postgres: FATAL: sorry, too many clients already 【发布时间】:2018-11-22 18:53:45 【问题描述】:

我在我的 Spring Boot 应用程序中使用 postgres 作为数据库,当我运行我的应用程序时,我收到错误 FATAL: sorry, too many clients already。我在 application.yml 中配置了一个连接池,但我仍然有同样的问题

spring:
  jpa:
    database: postgresql
    hibernate:
      ddl-auto: update
  datasource:
    url: jdbc:postgresql://localhost:5432/sp
    username: sp
    password: admin
    continueOnError: true
    platform: dev
    tomcat:
      maxIdle: 10
      max-active: 100
      max-wait: 10000
      validationQuery: select 1
      removeAbandoned: true
      removeAbandonedTimeout: 120
      logAbandoned: true
      testOnBorrow: true
      testOnConnect: true
      testWhileIdle: true

2018-06-13 09:29:47.311 [错误] [main] [logging.DirectJDKLog:181] 无法创建池的初始连接。 org.postgresql.util.PSQLException: FATAL: desolé, trop de clients sont déjà connectés 在 org.postgresql.core.v3.ConnectionFactoryImpl.doAuthentication(ConnectionFactoryImpl.java:443) 在 org.postgresql.core.v3.ConnectionFactoryImpl.openConnectionImpl(ConnectionFactoryImpl.java:217) 在 org.postgresql.core.ConnectionFactory.openConnection(ConnectionFactory.java:51) 在 org.postgresql.jdbc.PgConnection.(PgConnection.java:215) 在 org.postgresql.Driver.makeConnection(Driver.java:404) 在 org.postgresql.Driver.connect(Driver.java:272) 在 org.apache.tomcat.jdbc.pool.PooledConnection.connectUsingDriver(PooledConnection.java:310) 在 org.apache.tomcat.jdbc.pool.PooledConnection.connect(PooledConnection.java:203) 在 org.apache.tomcat.jdbc.pool.ConnectionPool.createConnection(ConnectionPool.java:735) 在 org.apache.tomcat.jdbc.pool.ConnectionPool.borrowConnection(ConnectionPool.java:667) 在 org.apache.tomcat.jdbc.pool.ConnectionPool.init(ConnectionPool.java:482) 在 org.apache.tomcat.jdbc.pool.ConnectionPool.(ConnectionPool.java:154) 在 org.apache.tomcat.jdbc.pool.DataSourceProxy.pCreatePool(DataSourceProxy.java:118) 在 org.apache.tomcat.jdbc.pool.DataSourceProxy.createPool(DataSourceProxy.java:107) 在 org.apache.tomcat.jdbc.pool.DataSourceProxy.getConnection(DataSourceProxy.java:131)

【问题讨论】:

【参考方案1】:

检查 postgresql.conf 文件中的参数 ma​​x_connections 以及 application.yml 中显示的连接总数

ALTER SYSTEM SET max_connections ='150';

并使用

重新启动您的实例
select pg_reload_conf();

注意:连接数取决于活动和空闲连接,设置更多的连接数会过度杀死进程。

【讨论】:

我无权访问 postgresql.conf 文件,我使用 pgAdmin,我执行 SHOW max_connections; 它显示了我 max_connections=100 哦,增加 postgresql.conf 中的连接数,因为正如我在您的 application.yml 中看到的,您有 101010 连接处于空闲、活动和等待状态.. 有没有不修改postgresql.conf文件的解决方案? @PawanSharma 你从哪里拉出101010?根据配置的最大值为 100 (max-active)。因此,将max_connections 增加到 100 多一点就足够了(假设一个实例,并且可能有少量来自其他工具的连接。将其设置为 20000 是多余的。 @Mark Rotteveel 这只是一个例子【参考方案2】:

工作示例

application.yml

version: '3.6'
services:
  db:
    image: postgres
    ports:
      - 54321:5432
    environment:
      - POSTGRES_PASSWORD=myPassword
      - POSTGRES_USER=sa
      - POSTGRES_DB=testdatabase
    volumes:
      - ./src/main/resources/pg-init-scripts:/docker-entrypoint-initdb.d

资源/pg-init-scripts/connections.sql

ALTER SYSTEM SET max_connections ='1000';
select pg_reload_conf();

资源/pg-init-scripts/init.sql

-- your stuff

将执行 init 文件夹中的所有脚本。

【讨论】:

【参考方案3】:

我在开发过程中突然开始在我的 django 应用程序中遇到同样的错误。首先想到的是 django 代码在某处打开了一个连接,但没有关闭它。然而,事实证明问题出在 pgadmin4 上。每当我在 pgadmin 中查看一个表时(只是一个简单的“查看 > 所有行”),连接数都会增加 1。

为了弄清楚这一点,我查看了 pgadmin 中的一些表,并使用测试网站向我的开发服务器发出了一些请求,并且在每一步之后,我都通过以下方式检查了连接数

SELECT COUNT(*) from pg_stat_activity;

要关闭来自 pgadmin 的连接,我必须断开 pgadmin 与服务器的连接并重新连接。因此,在更改 max_connections 值之前,您可能想弄清楚哪个应用程序/程序正在打开而不是关闭连接。就我而言,事实证明不需要更改值或实现池机制,只需在开发过程中偶尔重启 pgadmin。

【讨论】:

以上是关于spring boot postgres:致命:对不起,已经有太多客户了的主要内容,如果未能解决你的问题,请参考以下文章

Spring Boot 应用程序对 postgres 执行大量 SET application_name 查询

Docker Compose + Spring Boot + Postgres 连接,导致报错

强调 spring boot 服务时消耗的 GCP Postgres 连接(使用 SQL Cloud 代理)

为啥 spring-boot 和 postgres 连接会在一段时间后断开?

序列不存在 - Postgres/Spring Boot

遇到致命问题:使用 ruby​​ on rails 对用户“postgres”进行对等身份验证失败