用 HikariCP 深入理解 Spring boot

Posted

技术标签:

【中文标题】用 HikariCP 深入理解 Spring boot【英文标题】:Deep understanding of Spring boot with HikariCP 【发布时间】:2021-08-21 14:43:00 【问题描述】:

我有一个 spring boot 应用程序,它使用 spring 数据和 hikaricp 进行数据库连接池。我注意到以下对我来说很奇怪的行为:

我有一种方法不是事务性的,在该方法中,使用 spring 数据存储库执行了几个 db 查询

public void testMethod(final Long firstRepositoryId, final Long secondRepositoryId) 

    final DomainObject result = firstRepository.findById(firstRepositoryId);
    // here there's some code that is processing the result without db queries
    secondRepository.findById(secondRepositoryId);
    // some more logic here without additional db queries
  

因此,正如预期的那样,当方法上没有事务时,spring data 方法会打开一个事务来执行查询,并在方法返回后完成它。我已启用事务日志记录,因此有以下日志输出:

2021-06-03 15:34:30.961 TRACE c681f76a-5d7e-41d5-9e50-fb6f96169681 --- [tp659271212-291] o.s.t.i.TransactionInterceptor:获取 [com.test.FirstRepository.findById] 的交易 2021-06-03 15:34:30.966 TRACE c681f76a-5d7e-41d5-9e50-fb6f96169681 --- [tp659271212-291] o.s.t.i.TransactionInterceptor:为 [com.test.FirstRepository.findById] 完成交易 2021-06-03 15:34:30.967 TRACE c681f76a-5d7e-41d5-9e50-fb6f96169681 --- [tp659271212-291] os.t.i.TransactionInterceptor:获取 [com.test.SecondRepository.findById] 的交易 2021-06-03 15:34:30.972 TRACE c681f76a-5d7e-41d5-9e50-fb6f96169681 --- [tp659271212-291] os.t.i.TransactionInterceptor:完成 [com.test.SecondRepository.findById] 的交易

一切似乎都如我所愿。我无法理解的是光的行为。此方法在 http 请求中调用。在执行 firstRepository.findById 后立即从 hikari cp 获取一个连接,但只有在 http 控制器返回响应后,此连接才会在池中返回。我期望的是在事务打开后建立连接,并在事务完成后返回。有什么我想念的或者我有一些错误的配置吗?

附:我正在通过 spring boot actuator prometheus 数据监控活动的 hikari 连接。为了能够重现我在上面解释的行为,我正在使用几个调试断点暂停连接线程。

【问题讨论】:

【参考方案1】:

我发现了导致这种行为的原因——Spring 的功能是在视图中维护休眠会话,以便能够在视图中检索延迟加载的数据。为了禁用它,您需要以下属性:

spring.jpa.open-in-view=false

这是另一个 SO 帖子,其中解释了它的作用:

What is this spring.jpa.open-in-view=true property in Spring Boot?

【讨论】:

以上是关于用 HikariCP 深入理解 Spring boot的主要内容,如果未能解决你的问题,请参考以下文章

终于理解Spring Boot 为什么青睐HikariCP了,图解的太透彻了!

终于理解Spring Boot 为什么青睐HikariCP了,图解的太透彻了!

spring-boot2默认的数据源--HikariCP

mybatis整合hikariCP(非spring)

Spring Boot 数据库连接池 HikariCP

Spring Boot hikaricp 配置