休眠身份与序列实体标识符生成器

2022-09-01 18:03:51

这篇文章说:

与标识不同,列值的下一个数字将从内存中检索,而不是从磁盘中检索 - 这使得序列比标识快得多

这是否意味着ID来自磁盘,以防身份?如果是,那么哪个磁盘以及如何

使用序列,我可以在日志中看到,在插入新记录时对DB的额外选择查询。但是我没有在身份的情况下在日志中找到额外的选择查询。那么,序列如何变得比身份更快呢


答案 1

序列使用的策略:

在插入新行之前,请向数据库询问下一个序列值,然后以返回的序列值作为 ID 插入此行。

身份使用的策略:

插入一行而不指定 ID 的值。插入行后,向数据库询问上次生成的 ID。

因此,在这两种情况下,查询数是相同的。但是,默认情况下,Hibernate 使用对序列生成器更有效的策略。实际上,当它请求下一个序列值时,它会在内存中保留 th 50(即 dafault,IIRC,它是可配置的)下一个值,并将这 50 个 next 值用于接下来的 50 个插入。只有在插入 50 次后,它才会转到数据库以获取 50 个下一个值。这大大减少了自动ID生成所需的SQL查询数量。

标识策略不允许进行此类优化。


答案 2

生成器将始终需要数据库命中来获取主键值,而无需等待刷新将当前实体状态转换与数据库同步。IDENTITY

因此,生成器不能很好地与 Hibernate 写后第一级缓存策略配合使用,因此为 IDENTITY 生成器禁用了 JDBC 批处理。IDENTITY

序列生成器可以从数据库值预分配中受益,您甚至可以采用高/低优化策略。

在我看来,最好的生成器是和 pooled-lo 序列生成器。这些生成器将批处理友好的序列生成器与客户端值生成优化相结合,该优化与其他数据库客户端兼容,这些客户端可能会在不了解我们的生成策略的情况下插入行。pooled

无论如何,你永远不应该选择TABLE生成器,因为它的性能非常糟糕。


推荐