20

昨天偶遇了HikariCP,研究了一晚上。我对微调其实现和设计所付出的大量细节和努力印象深刻。直截了当,我无法确定它实际上是如何处理那些autoCommit设置为的连接被检入池中的false,而它们既没有commit()也没有rollback()发出,例如,由于异常。对于下一个请求者来说,这可能是许多严重事务问题的根源,他们期望一个新的连接,但不幸的是接收到这个带有悬空事务状态的连接。

虽然 C3P0 和 Tomcat 的 JDBC 池为此目的(通过配置或拦截)有一些所谓的旋钮,但我在 HikariCP 的文档或支持组中找不到任何内容。如果我错了,请纠正我,但是编写一个简单的单元测试表明池对此没有任何作用。

我需要知道这个观察是否真的正确,我没有遗漏任何东西。此外,如果有任何计划在 HikariCP 中解决这个问题,因为这对我来说很重要。

谢谢。

4

1 回答 1

30

我是 HikariCP 的作者之一。如果关闭自动提交,HikariCP 不会自动执行提交或回滚。通常期望显式关闭自动提交的应用程序准备好正确处理这些(建议在一个finally块中) - 就像官方 JDBC 文档中的这个示例一样。

如果连接返回到池且自动提交设置为 false,我们愿意为 HikariCP 添加自动“回滚”行为(但不是自动“提交”)。如果您希望这种行为,请打开功能请求。

更新:HikariCP 1.2.2 及更高版本对关闭的连接执行自动“回滚”,自动提交设置为“假”。此外,它会将事务隔离级别重置为配置的默认值,并且如以下评论中所述,当然会关闭打开的语句等。

更新:HikariCP 2.3.x 及更高版本现在在 auto-commit 设置为 时额外跟踪事务状态,false如果事务状态干净,将绕过自动回滚操作。

于 2013-12-25T19:21:07.460 回答