用 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了,图解的太透彻了!