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

2024-01-02

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

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

另一方面,我注意到 Oracle 序列是使用“INCRMENT BY 1”创建的。也许将其相应地设置为allocationSize 可以解决问题吗?

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

预先感谢您的建议!


是的,的价值allocationSize你的SequenceGenerator并且数据库递增序列的步骤必须相同。

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

如果你保留了,你就不需要担心重复的IDallocationSize以及同步序列的增量。

比方说;您有 2 台服务器连接到同一个数据库。两台服务器都使用allocationSize为 50,并且您将数据库序列配置为递增 50。

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

与此同时,Server2 从序列中请求一个新值并获取 1050。它将递增该值直到 1099。

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

javax.persistence.SequenceGenerator.allocationSize() 应该与 INCRMENT BY 一致吗? 的相关文章

随机推荐