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

Posted

技术标签:

【中文标题】Spring Boot 应用程序对 postgres 执行大量 SET application_name 查询【英文标题】:Spring Boot application performs extremely high number of SET application_name queries to postgres 【发布时间】:2021-07-28 18:38:49 【问题描述】:

我有一个使用 JPA (Hibernate) 连接到 Postgres DB 的 Spring Boot 应用程序 (v2.2.5.RELEASE)。 Spring Boot 使用 HikariCP 进行连接池。在我的生产环境中,无论数据库活动如何,我都会看到每隔几秒执行一次以下查询(几乎就好像它们是某种健康检查?):

SET application_name = 'PostgreSQL JDBC 驱动程序'

ps:在服务器中启动应用程序 3 小时后,CPU 利用率超过 350%

这些查询是否必要?可以避免吗?

在application.properties中配置HikariCP

spring.datasource.type=com.zaxxer.hikari.HikariDataSource
# Hikari will use the above plus the following to setup connection pooling
spring.datasource.hikari.minimumIdle=5
spring.datasource.hikari.maximumPoolSize=10
spring.datasource.hikari.idleTimeout=300
spring.datasource.hikari.poolName=SpringBootJPAHikariCP
spring.datasource.tomcat.maxIdle=150

spring.jpa.hibernate.connection.provider_class=org.hibernate.hikaricp.internal.HikariCPConnectionProvider


spring.datasource.hikari.connectionTimeout=30000 
spring.datasource.hikari.maxLifetime=30000
spring.datasource.testWhileIdle=true
spring.datasource.validationQuery=SELECT 1

【问题讨论】:

这些语句不会导致 CPU 使用率过高。找出真正是您的问题的陈述。 当我执行查询“SELECT pid, query FROM pg_stat_activity;”我得到“SET application_name = 'PostgreSQL JDBC Driver'”,我注意到 pid 的数量在增加。 我怎么知道真正的问题?为什么 postgres 的 pid 会增加 @mohamedaminesalah 我面临着类似的问题。你找到解决方案了吗? 【参考方案1】:

只要 JDBC 驱动程序与 PostgreSQL 建立连接,就会运行此 SQL 语句。如果您经常看到该语句,这意味着您打开(并希望关闭)大量数据库连接,也就是说,您为每个请求打开一个数据库连接。

打开数据库连接非常昂贵。如果我的猜测是正确的,您应该使用连接池和持久的、长期存在的数据库连接。这将减少负载并提高吞吐量。

【讨论】:

我希望这可以帮助我,如果我忘记了什么,我会在我的代码中搜索。 我们使用的是spring boot,所以它自己管理池【参考方案2】:

您的游泳池寿命很短,

spring.datasource.hikari.maxLifetime=30000

这意味着空闲连接将仅保留 30 秒,然后将其丢弃,并替换为新连接。

默认值足以作为起点:

spring.datasource.hikari.idleTimeout=60000
spring.datasource.hikari.connectionTimeout=30000 
spring.datasource.hikari.maxLifetime=180000

【讨论】:

以上是关于Spring Boot 应用程序对 postgres 执行大量 SET application_name 查询的主要内容,如果未能解决你的问题,请参考以下文章

序列不存在 - Postgres/Spring Boot

Spring Boot 2 不适用于 Postgres

docker-compose spring boot无法连接到Postgres [重复]

Spring Boot 降级 postgres 版本

Docker Compose (TOMCAT + POSTGRES) - Spring Boot 应用程序:容器之间的连接问题

使用 Postgres docker 实例运行 Spring Boot docker 实例