【问题标题】:Hibernate vs Spring connection acquisition strategyHibernate vs Spring 连接获取策略
【发布时间】:2020-04-16 16:35:23
【问题描述】:

我试图了解在使用 hibernate 作为 ORM 和 Spring 进行事务管理的应用程序中何时获取数据库连接。

this 文章中,它说:

如果事务管理器决定创建一个新事务,那么它将:

创建一个新的实体管理器

将实体管理器绑定到当前线程

从数据库连接池中获取一个连接

将连接绑定到当前线程

但是 here 它说:

Hibernate 延迟数据库连接获取,直到当前事务必须执行其第一个 SQL 语句(由读取或写入操作触发)。这种优化允许 Hibernate 减少物理事务间隔,从而增加从池中获取连接的机会。

如果 Spring 之前决定获取连接,我无法理解 Hibernate 如何延迟连接获取。

【问题讨论】:

    标签: java spring hibernate orm


    【解决方案1】:

    I can't understand how can Hibernate delay the connection aquisition if Spring decides to aquire it before.

    由事务管理器做出决定,因此可能由JpaTransactionManager/HibernateTransactionManager 做出决定

    Hibernate 5.2.0 引入了新属性hibernate.connection.provider_disables_autocommit

    有了这个Hibernate可以延迟数据库连接的获取,直到有一个JDBC Statement要执行。否则进入@Transactional服务方法时获取数据库连接。

    因此,要允许 Spring 在设置 spring 上下文期间将此属性连接到 JPATransactionManager,您必须在 application.properties/yaml 中设置此属性 --> spring.jpa.properties.hibernate.connection.provider_disables_autocommit

    执行此操作所需的最后一件事 --> 在连接池提供程序上 setAutoCommit 为 false(自 Spring boot 2 起默认为 HikariCP) spring.datasource.hikari.auto-commit=false

    【讨论】:

      猜你喜欢
      • 2012-09-21
      • 2015-11-16
      • 1970-01-01
      • 2013-09-21
      • 2010-12-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多