繁体   English   中英

javax.persistence.SequenceGenerator.allocationSize()应该与INCREMENT BY一致吗?

[英]Should javax.persistence.SequenceGenerator.allocationSize() be consistent with INCREMENT BY?

我有一个使用Hibernate javax.persistence.SequenceGenerator.allocationSize()属性的问题。 当它设置为1时,我在向数据库插入大量记录时遇到性能问题。 否则,当我将其设置为默认值(50)或更高值时,我会收到异常,即具有指定标识符的实体已存在!

最大的问题是很多开发人员使用共享数据库,因此生成的标识符实际上可能无法同步。

另一方面,我注意到使用“INCREMENT BY 1”创建的Oracle序列。 可以相应地设置这个,allocateSize可以解决问题吗?

我使用的是WildFly 10.1(所以Hibernate版本是5.0.10)和Oracle 12c(12.2.0.1)。

提前感谢您的建议!

是的, SequenceGeneratorallocationSize的值以及数据库递增序列的步骤必须相同。

如果将allocationSize属性设置为50,则告诉Hibernate序列增加50并且在从序列中选择下一个值之前它将在内部生成49个值。

如果保持allocationSize和序列的增量同步,则无需担心重复的ID。

我们说吧; 你有2台服务器连接到同一个数据库。 两个服务器都使用50的allocationSize ,并且您将数据库序列配置为增加50。

Server1从序列中请求一个新值并获得1000.它将在内部存储该值并将其递增直到达到1049。

在此期间,Server2从序列中请求一个新值并获得1050.它将该值递增到1099。

数据库序列返回的下一个值将是1100.如您所见,将没有重复的ID。 但主键值之间可能存在间隙,您无法使用它们按时间顺序排序数据库记录。 但你不应该使用主键...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM