You*_*sef 21 java spring hibernate jpa transactions
Hibernate文档说:
如果您使用身份标识符生成器,Hibernate会透明地禁用JDBC级别的插入批处理.
但是我的所有实体都有这样的配置:
@Id
@GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY)
private Integer id;
Run Code Online (Sandbox Code Playgroud)
当我在上面使用这个身份时
IDENTITY
?Vla*_*cea 30
Hibernate试图将持久性上下文推迟到最后一刻.这种策略传统上称为事务性后写.
后写与Hibernate刷新更相关,而不是任何逻辑或物理事务.在交易期间,可以多次发生冲洗.
刷新的更改仅对当前数据库事务可见.在提交当前事务之前,其他并发事务不会看到任何更改.
所述IDENTITY发生器允许的整数/ BIGINT列是自动递增上的需求.增量过程发生在当前运行的事务之外,因此回滚可能最终丢弃已分配的值(可能发生值差异).
增量过程非常有效,因为它使用数据库内部轻量级锁定机制,而不是更重量级的事务过程 - 谷物锁定.
唯一的缺点是在执行INSERT语句之前我们无法知道新分配的值.这种限制阻碍了Hibernate采用的"事务性写入"冲洗策略.因此,Hibernates禁用对使用IDENTITY生成器的实体的JDBC批处理支持.
唯一的解决方案是使用TABLE标识符生成器,由pooled-lo优化器支持.这个生成器也适用于MySQL,因此它克服了数据库SEQUENCE支持的缺乏.但是,TABLE生成器的性能比IDENTITY差,所以最后,这不是一个可行的替代方案.因此,使用IDENTITY仍然是MySQL的最佳选择,如果你需要批量插入,你可以使用jOOQ.Hibernate和jOOQ是一个很棒的组合.
归档时间: |
|
查看次数: |
8647 次 |
最近记录: |