休眠身份与序列实体标识符生成器
这篇文章说:
与标识不同,列值的下一个数字将从内存中检索,而不是从磁盘中检索 - 这使得序列比标识快得多
这是否意味着ID来自磁盘,以防身份?如果是,那么哪个磁盘以及如何?
使用序列,我可以在日志中看到,在插入新记录时对DB的额外选择查询。但是我没有在身份的情况下在日志中找到额外的选择查询。那么,序列如何变得比身份更快呢?
这篇文章说:
与标识不同,列值的下一个数字将从内存中检索,而不是从磁盘中检索 - 这使得序列比标识快得多
这是否意味着ID来自磁盘,以防身份?如果是,那么哪个磁盘以及如何?
使用序列,我可以在日志中看到,在插入新记录时对DB的额外选择查询。但是我没有在身份的情况下在日志中找到额外的选择查询。那么,序列如何变得比身份更快呢?
序列使用的策略:
在插入新行之前,请向数据库询问下一个序列值,然后以返回的序列值作为 ID 插入此行。
身份使用的策略:
插入一行而不指定 ID 的值。插入行后,向数据库询问上次生成的 ID。
因此,在这两种情况下,查询数是相同的。但是,默认情况下,Hibernate 使用对序列生成器更有效的策略。实际上,当它请求下一个序列值时,它会在内存中保留 th 50(即 dafault,IIRC,它是可配置的)下一个值,并将这 50 个 next 值用于接下来的 50 个插入。只有在插入 50 次后,它才会转到数据库以获取 50 个下一个值。这大大减少了自动ID生成所需的SQL查询数量。
标识策略不允许进行此类优化。
生成器将始终需要数据库命中来获取主键值,而无需等待刷新将当前实体状态转换与数据库同步。IDENTITY
因此,生成器不能很好地与 Hibernate 写后第一级缓存策略配合使用,因此为 IDENTITY
生成器禁用了 JDBC 批处理。IDENTITY
序列生成器可以从数据库值预分配中受益,您甚至可以采用高/低
优化策略。
在我看来,最好的生成器是和 pooled-lo
序列生成器。这些生成器将批处理友好的序列生成器与客户端值生成优化相结合,该优化与其他数据库客户端兼容,这些客户端可能会在不了解我们的生成策略的情况下插入行。pooled
无论如何,你永远不应该选择TABLE
生成器,因为它的性能非常糟糕。