JPA中的@SequenceGenerator.allocationSize是什么意思?

8
我进行了大量的谷歌搜索,并发现许多人说allocationSizehttps://www.logicbig.com/tutorials/java-ee-tutorial/jpa/seq-generator.html中的含义是'在达到' allocationSize '之后,下一个id将再次从数据库序列中检索'。

而在JPA文档中它的意思是:

The amount to increment by when allocating sequence numbers from the sequence

看起来它与sql中的“increment by”相同。

哪一个是正确的?因为我在h2 / jpa中测试过,这个allocationSize不起作用,即使将其设置为20,序列的下一个值也不会增加20。

我也对sql中的“cache”感到困惑。

总之,以以下示例为例。

CREATE SEQUENCE ITEM_ID_SEQ START WITH 1 INCREMENT BY 100 cache 30;
INCREMENT BY 100, cache 30, 和 jpa的allocationSize有什么区别?
谢谢。
1个回答

16

以下是配置值的简要说明:

allocationSize

为了最小化与数据库服务器之间的往返次数,ID会分组分配。每个分配中ID的数量由allocationSize属性指定。

可能会有一些给定分配中的ID未被使用。因此,这种策略不能保证序列值中没有间隔。

默认值为50。

INCREMENT BY

指定序列号之间的间隔。

这个整数值可以是任何正整数或负整数,但不能为0。

如果这个值是负数,则序列递减。如果这个值是正数,则序列递增。如果省略了这个子句,则间隔默认为1。

CACHE

指定数据库预分配并保留在内存中以实现更快访问的序列值的数量。

如果系统发生故障,则所有未在提交的DML语句中使用的缓存序列值都会丢失。潜在的丢失值的数量等于CACHE参数的值。

结论

allocationSize和INCREMENT BY必须具有相同的值。较高的值可减少数据库往返次数。

Cache是DB性能优化功能,并非所有数据库类型都可用。


通过这个解释,为什么allocationSize和INCREMENT BY必须有相同的值呢?我可以使用allocationSize=50来阻止我的实体使用1、2、3、...、50这些id。如果我持久化了3个实体,它们将具有id 1、2和3。 如果我改为定义increment by 3,那么我将得到id为1、4和7的实体。 - Chris311
Hibernate 调用序列以获取 50 个序列号,因此增量必须具有该大小。 - Simon Martinelli
如果allocationSize=5,而增量为1,会发生什么? - Chris311
试一下吧;-) 你会得到重复的键。 - Simon Martinelli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接