深入理解 Spring boot with HikariCP

Deep understanding of Spring boot with HikariCP

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

我有一种非事务性方法,在该方法中,使用 spring 数据存储库执行多个数据库查询

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 数据方法会打开一个事务来执行查询,并在方法 returns 之后完成它。我启用了事务日志记录,因此有以下日志输出:

2021-06-03 15:34:30.961 TRACE c681f76a-5d7e-41d5-9e50-fb6f96169681 --- [tp659271212-291] o.s.t.i.TransactionInterceptor : Getting transaction for [com.test.FirstRepository.findById] 2021-06-03 15:34:30.966 TRACE c681f76a-5d7e-41d5-9e50-fb6f96169681 --- [tp659271212-291] o.s.t.i.TransactionInterceptor : Completing transaction for [com.test.FirstRepository.findById] 2021-06-03 15:34:30.967 TRACE c681f76a-5d7e-41d5-9e50-fb6f96169681 --- [tp659271212-291] o.s.t.i.TransactionInterceptor : Getting transaction for [com.test.SecondRepository.findById] 2021-06-03 15:34:30.972 TRACE c681f76a-5d7e-41d5-9e50-fb6f96169681 --- [tp659271212-291] o.s.t.i.TransactionInterceptor : Completing transaction for [com.test.SecondRepository.findById]

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

P.S。我正在通过 spring 引导执行器普罗米修斯数据监视活动的 hikari 连接。为了能够重现我上面解释的行为,我用几个调试断点暂停了连接线程。

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

spring.jpa.open-in-view=false

这是另一个 SO post 解释了它的作用: