【问题标题】:Spring Data JPA with Hikari: Why is hikari auto-commit property set to 'true'?带有 Hikari 的 Spring Data JPA:为什么 hikari 自动提交属性设置为“true”?
【发布时间】:2023-03-04 06:25:01
【问题描述】:

Spring Data JPA 或 Hibernate 默认将自动提交设置为 false。这听起来很合理,因为这些框架与实体一起工作,并且对实体的更新可能涉及通过多个 SQL 查询对多个表的更新。因此,通过将 auto-commit 设置为 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 的回答和讨论。
对于使用带有@Transactional(100% Hiberante)的spring data jpa 的项目,将hikaris 连接池设置更改为auto-commit=false 应该会带来性能优势。详情请参阅答案和后续讨论。

【问题讨论】:

  • 请阅读 ken-chan 的回答和讨论。它进入了很好的细节。如果您认为问答带来了有用的学习,请为问答投票。

标签: spring-boot hibernate spring-data-jpa hikaricp


【解决方案1】:

我认为 Hikari 只是遵循 JDBC 定义的默认自动提交值(即 true),以便与其默认行为保持一致。(参见 this

您的猜测是正确的,框架会注意配置 JDBC Connection 的必要自动提交值,以便它可以在多个 JDBC Statement 上执行事务处理。

例如在 Spring @Transactionl using 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);
}
    

【讨论】:

  • 你可以按照这个项目的日志来验证我在 hikar auto-commit=true 上的发现 - github.com/ramshers/JPAInPractice/tree/master
  • 感谢您通过 Spring 代码参考阐明第二点。 +1
  • Hikari 的默认自动提交值已经在他们的网站github.com/brettwooldridge/HikariCP#frequently-used 中提到过
  • 正确。所以这就是它总结的内容 - the framework will take care to configure the necessary auto-commit 并且每次都会覆盖 hikari 设置的默认“true”。谢谢。但是从 java 文档来看,这种翻转将花费时间。那么,将默认值设置为“false”以节省一些时间对我来说是否明智......使用休眠(spring data jpa)时。
  • 或基于您提供的参考资料。我现在应该将我的 Q 改写为 - 对于 Spring Data JPA (Hibernate) 项目,spring boot 2 默认连接池提供程序,即 Hikari 的默认 auto-commit=true 是有意义的。如果将其更改为 false 以提高性能会不会安全,或者我会遇到其他麻烦。
猜你喜欢
  • 1970-01-01
  • 2015-06-16
  • 2018-07-31
  • 2019-07-13
  • 2015-10-31
  • 2019-10-28
  • 2021-12-16
  • 2022-07-15
  • 2010-11-10
相关资源
最近更新 更多