首页 > 解决方案 > Spring Boot 应用程序对 postgres 执行大量 SET application_name 查询

问题描述

我有一个使用 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

标签: postgresqlspring-bootserverhikaricp

解决方案


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

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


推荐阅读