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 查询的主要内容,如果未能解决你的问题,请参考以下文章
docker-compose spring boot无法连接到Postgres [重复]
Docker Compose (TOMCAT + POSTGRES) - Spring Boot 应用程序:容器之间的连接问题