【发布时间】:2018-09-27 17:10:18
【问题描述】:
我有一个项目在 Spring Boot 1.3.8、Hikari CP 2.6.1 和 Hibernate (Spring ORM 4.2.8) 上运行。服务层代码如下:
public void doStuff() {
A a = dao.findByWhatever();
if (a.hasProperty()) {
B b = restService.doRemoteRequestWithRetries(); // May take long time
}
a.setProp(b.getSomethig());
dao.save(b);
}
Hikari 配置有这个:spring.datasource.leakDetectionThreshold=2000。
问题是外部 REST 服务非常慢并且通常需要 2 秒以上的时间来响应,因此我们看到很多 java.lang.Exception: Apparent connection leak detected 都是假阴性,尽管问题可以很明显地看到:我们保持 DB 连接我们执行休息请求的时间。
问题是:如何正确解耦 DB 和 REST 的东西?或者如何告诉休眠在两者之间释放连接?这样我们就可以在等待 REST 响应时将 DB 连接返回到池中。
我已经尝试设置hibernate.connection.release_mode=AFTER_TRANSACTION 并且它有点帮助,至少我们没有连接泄漏异常。唯一的问题是我们的测试开始显示:
2018-04-17 15:48:03.438 WARN 94029 --- [ main] o.s.orm.jpa.vendor.HibernateJpaDialect : JDBC Connection to reset not identical to originally prepared Connection - please make sure to use connection release mode ON_CLOSE (the default) and to run against Hibernate 4.2+ (or switch HibernateJpaDialect's prepareConnection flag to false`
测试使用注入的 DAO 在 DB 中插入记录,然后通过应用程序 API 检查它们。它们没有使用@Transactional 进行注释,并且侦听器列表如下所示:
@TestExecutionListeners({
DependencyInjectionTestExecutionListener.class,
TransactionalTestExecutionListener.class,
TransactionDbUnitTestExecutionListener.class
})
有什么想法可能是测试的问题吗?
【问题讨论】:
-
您的
@Service或@Controller是否带有@Transactional注释?您提到测试不是,但生产代码中的事务边界在哪里?希望您没有在 Java 代码中管理事务,例如通过自动连线txManagerbean。 -
不,我没有在代码中使用
txManager。我的 bean 都没有用@Transactional注释,我最终注释了 DAO。
标签: java hibernate spring-boot transactional hikaricp