带有 Hikari 的 Spring Data JPA:为啥 hikari 自动提交属性设置为“true”?

Posted

技术标签:

【中文标题】带有 Hikari 的 Spring Data JPA:为啥 hikari 自动提交属性设置为“true”?【英文标题】:Spring Data JPA with Hikari: Why is hikari auto-commit property set to 'true'?带有 Hikari 的 Spring Data JPA:为什么 hikari 自动提交属性设置为“true”? 【发布时间】:2021-12-10 03:16:40 【问题描述】:

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 的回答和讨论。它进入了很好的细节。如果您认为问答带来了有用的学习,请为问答投票。 【参考方案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 以提高性能会不会安全,或者我会遇到其他麻烦。

以上是关于带有 Hikari 的 Spring Data JPA:为啥 hikari 自动提交属性设置为“true”?的主要内容,如果未能解决你的问题,请参考以下文章

带有 mysql 的 Spring Boot 应用程序卡在“Hikari-Pool-1 - 正在启动...”

带有PostgreSQL,Flyway和Hikari的Spring Boot 2:驱动程序声称不接受jdbcUrl

如何在不启动 HikariPool 关闭的情况下使用 Hikari 数据源运行 Spring Boot 应用程序

使用 Spring Boot 的 Mysql 的 Hikari 配置

聊聊hikari连接池的leakDetectionThreshold

Spring Boot Hikari 配置