sam*_*ers 5 hibernate spring-data-jpa spring-boot hikaricp
Spring Data JPA 或 Hibernate 默认情况下自动提交设置为 false。这听起来很合理,因为这些框架与实体一起工作,并且对实体的更新可能涉及通过多个 SQL 查询对多个表进行更新。因此,通过将自动提交设置为 false 并显式控制事务,这些框架可确保对实体的更改是原子的且一致的。
但现在 Hikari 是 spring data jpa 的默认连接池提供程序,在查看应用程序日志时,我看到 hikari 将连接池的自动提交设置为 true。
2021-10-24 11:30:07.815 DEBUG [restartedMain] com.zaxxer.hikari.HikariConfig||HikariConfig.logConfiguration:1135: autoCommit................................true
Run Code Online (Sandbox Code Playgroud)
关于为什么这样设置以及这是否会影响事务的任何解释(我不认为它会影响事务,因为每个事务可能会再次将自动提交设置为 false,从而接管何时提交事务。)
编辑 - 遵循 @ken-chan 的回答和讨论。
对于使用 spring data jpa 和 @Transactional(100% Hiberante)的项目,将 hikaris 连接池设置更改为auto-commit=false应该会带来性能优势。请参阅答案和后续讨论以了解更多详细信息。
我认为 Hikari 只是遵循 JDBC 定义的默认自动提交值(即 true),以便与其默认行为保持一致。(请参阅此)
您的猜测是正确的,框架将注意配置 JDBC 必要的自动提交值,Connection以便它可以通过多个 JDBC 执行事务处理Statement。
例如,在@Transactionl使用 JDBC 的 Spring 中,以下代码显示,如果启用了自动提交,它将在执行任何事务代码之前禁用它。它还将在完成交易后重新启用它。
// Switch to manual commit if necessary. This is very expensive in some JDBC drivers,
// so we don't want to do it unnecessarily (for example if we've explicitly
// configured the connection pool to set it already).
if (con.getAutoCommit()) {
txObject.setMustRestoreAutoCommit(true);
if (logger.isDebugEnabled()) {
logger.debug("Switching JDBC Connection [" + con + "] to manual commit");
}
con.setAutoCommit(false);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13464 次 |
| 最近记录: |