昨天我偶然遇到HikariCP,整整一夜都在研究它。我对fine tuning的实施和设计的细节和努力给我留下了深刻的印象。
直截了当,我无法确定它是如何实际处理将autoCommit
设置为false
时检入池中的连接,而commit()
和rollback()
都没有例如,由于例外而发布的。这可能是下一个期望新连接的请求者的许多严重事务问题的根源,但不幸的是,它以其悬空事务状态接收此连接。
虽然C3P0和Tomcat的JDBC池中有一些所谓的 Knobs 用于此目的(通过配置或拦截),但我在HikariCP的文档或支持组中找不到任何内容。如果我错了,请纠正我,但写一个简单的单元测试告诉我,游泳池对此没有任何意义。
我需要知道这个观察是否真的是正确的,我不会错过任何关于它的事情。此外,如果有任何计划在HikariCP中解决这个问题,因为这对我来说至关重要。
感谢。
答案 0 :(得分:22)
我是HikariCP的作者之一。如果关闭自动提交,HikariCP不会自动执行提交或回滚。通常期望明确关闭自动提交的应用程序准备好正确处理这些(在finally
块中推荐) - 如在官方JDBC文档中的this example中那样。
如果在自动提交设置为false的情况下将连接返回到池,我们愿意向HikariCP添加自动“回滚”行为(但不是自动“提交”)。如果您希望这种行为,请打开功能请求。
更新:HikariCP 1.2.2及更高版本对自动提交设置为“false”的已关闭连接执行自动“回滚”。此外,它会将事务隔离级别重置为配置的默认值,如下面的注释中所述,当然会关闭开放语句等。
更新:HikariCP 2.3.x及更高版本现在还可以在自动提交设置为false
时跟踪事务状态,并在事务状态为清除时绕过自动回滚操作。