当前位置: 首页 > 知识库问答 >
问题:

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

田慈
2023-03-14

默认情况下,Spring数据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

解释为什么这样设置以及这样做是否会影响事务(我不认为它会影响事务,因为每个事务可能会再次将自动提交设置为假,从而接管何时提交事务。)

编辑 - 遵循@ken-chan的答案和讨论。
对于使用 spring 数据 jpa 和 @Transactional(具有 100% Hiberante)的项目,将 hikaris 连接池设置更改为 auto-commit=false 应该会带来性能优势。有关更多详细信息,请参阅答案和后续讨论。

共有1个答案

葛泳
2023-03-14

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

并且您的猜测是正确的,那么该框架将负责配置JDBC 连接的必要的自动提交值,以便它可以在多个JDBC 语句上执行事务处理。

例如,在使用JDBC的Spring@Transactionl中,下面的代码显示,如果启用了自动提交,它将在执行任何事务代码之前禁用它。它还将在完成事务后重新启用它。

// 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);
}
    
 类似资料:
  • 为什么它们没有被应用?

  • 问题内容: 我一直想知道为什么JDBC API提供了自动提交模式()。似乎很吸引人的麻烦只是诱使人们陷入麻烦。我的理论是,仅将其添加到JDBC是为了简化希望创建使用JDBC编辑和运行SQL的工具的供应商的生活。是否有其他原因打开自动提交,还是总是错误? 问题答案: 不幸的是,使用自动提交是特定于数据库的(事务行为也是如此)。我认为,如果您没有全局的程序化交易策略,自动提交可能比仅希望每个人都正确关

  • 我正在尝试关闭Hikari上多个数据源的自动提交,但我没有任何运气。我使用的是Spring Boot2(2.0.3.发行版)。以下是我的配置:

  • 我使用JavaFX Scene Builder1.1创建了一个FXML文件。默认情况下创建AnchorPane。为什么我不能修改resizable属性?

  • 我正在阅读https://ci.apache.org/projects/flink/flink-docs-release-1.13/docs/connectors/datastream/kafka/#kafka-消费者补偿提交行为配置 它说: 启用检查点:如果启用了检查点,Flink Kafka使用者将在检查点完成时提交存储在检查点状态中的偏移量。这确保了Kafka代理中提交的偏移量与检查点状态中