为什么休眠在使用标识标识符生成器时禁用 INSERT 批处理

2022-09-01 01:02:47

Hibernate文档说:

休眠会在 JDBC 级别透明地禁用插入批处理,前提是您使用身份标识符生成器。

但我的所有实体都具有以下配置:

@Id
@GeneratedValue(strategy = javax.persistence.GenerationType.IDENTITY)
private Integer id;

当我在上面使用这个标识时 So

  1. 有什么问题?IDENTITY
  2. 是否禁用了批处理插入?
  3. 我该如何解决这个问题?

答案 1

事务性写后

休眠尝试将持久性上下文刷新推迟到最后一个可能的时刻。此策略传统上称为事务性后写。

后写与休眠刷新更相关,而不是任何逻辑或物理事务。在事务期间,刷新可能会发生多次。

刷新的更改仅对当前数据库事务可见。在提交当前事务之前,其他并发事务看不到任何更改。

身份

生成器允许或列根据需要自动递增。递增过程发生在当前正在运行的事务之外,因此回滚可能最终丢弃已分配的值(可能会发生值差距)。IDENTITYintbigint

增量过程非常有效,因为它使用数据库内部轻量级锁定机制,而不是更重的事务性课程粒度锁定。

唯一的缺点是,在执行 INSERT 语句之前,我们无法知道新分配的值。此限制阻碍了 Hibernate 采用的事务性写后冲洗策略。因此,Hibernates 禁用对使用生成器的实体的 JDBC 批处理支持。IDENTITY

桌子

唯一的解决方案是使用标识符生成器,由 pooled-lo 优化器提供支持。该生成器也适用于MySQL,因此它克服了缺乏数据库SEQUEEN支持的问题。TABLE

但是,TABLE 生成器的性能比 更差,因此最终,这不是一个可行的替代方案。IDENTITY

结论

因此,使用IDENTITY仍然是MySQL上的最佳选择,如果您需要批处理以进行插入,则可以使用JDBC。


答案 2

推荐