postgresql - 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
解决方案
每当 JDBC 驱动程序与 PostgreSQL 建立连接时,都会运行此 SQL 语句。如果您经常看到该语句,这意味着您打开(并希望关闭)大量数据库连接,也就是说,您为每个请求打开一个数据库连接。
打开数据库连接非常昂贵。如果我的猜测是正确的,您应该使用连接池和持久的、长期存在的数据库连接。这将减少负载并提高吞吐量。
推荐阅读
- r - 即使不存在也添加中断
- date - 如何在 Amazon Redshift 查询中选择上个季度/最近 2 个月的数据
- rollup - 别名或替换外部模块不起作用
- java - 使用 Gradle 为源代码生成 jar
- ldap - Apache Directory Studio:如何搜索自特定日期以来未更新的 LDAP 属性?
- postgresql - 无法在 postgresql 中创建用户
- google-sheets - 有没有办法让工作表根据日期和时间自动填充数据
- c++ - UE4 C++ 在初始化 HUDClass 后获取它的引用
- c# - 如何检查 customPrincipal 是否为空?
- reactjs - SCRIPT445:对象不支持此操作 create-react-app