Spring Data JPA with Hikari:为什么 hikari 自动提交 属性 设置为 'true'?
Spring Data JPA with Hikari: Why is hikari auto-commit property set to 'true'?
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
关于为什么这样设置以及这是否会影响交易的任何解释(我认为它不会影响交易,因为每个交易可能会再次将自动提交设置为 false,从而接管何时提交交易。)
编辑 - 按照@ken-chan 的回答和讨论。
对于使用 spring 数据 jpa 和 @Transactional(100% Hiberante)的项目,将 hikaris 连接池设置更改为 auto-commit=false
应该会带来性能优势。请参阅答案和后续讨论以获取更多详细信息。
我认为 Hikari 只是遵循 JDBC 定义的默认自动提交值(即 true)以与其默认行为保持一致。(参见 this)
并且您的猜测是正确的,框架将注意配置 JDBC Connection
的必要自动提交值,以便它可以对多个 JDBC Statement
.
例如在 Spring @Transactionl
中使用 JDBC ,下面的 codes 表明如果启用了自动提交,它将在执行任何事务之前禁用它代码。它还将在完成交易后重新启用它。
// 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);
}
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
关于为什么这样设置以及这是否会影响交易的任何解释(我认为它不会影响交易,因为每个交易可能会再次将自动提交设置为 false,从而接管何时提交交易。)
编辑 - 按照@ken-chan 的回答和讨论。
对于使用 spring 数据 jpa 和 @Transactional(100% Hiberante)的项目,将 hikaris 连接池设置更改为 auto-commit=false
应该会带来性能优势。请参阅答案和后续讨论以获取更多详细信息。
我认为 Hikari 只是遵循 JDBC 定义的默认自动提交值(即 true)以与其默认行为保持一致。(参见 this)
并且您的猜测是正确的,框架将注意配置 JDBC Connection
的必要自动提交值,以便它可以对多个 JDBC Statement
.
例如在 Spring @Transactionl
中使用 JDBC ,下面的 codes 表明如果启用了自动提交,它将在执行任何事务之前禁用它代码。它还将在完成交易后重新启用它。
// 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);
}