【问题标题】: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