我在使用 Hibernate javax.persistence.SequenceGenerator.allocationSize() 属性时遇到问题。当它设置为 1 时,我在向数据库中插入大量记录时会遇到性能问题。否则,当我将其设置为默认值 (50) 或更高值时,我会收到异常消息,指出具有指定标识符的实体已经存在!
最大的问题是很多开发者使用共享数据库,所以生成的标识符确实有可能不同步。
另一方面,我注意到 Oracle 序列是使用“INCREMENT BY 1”创建的。可能将此相应地设置为 allocationSize 可以解决问题?
我使用的是 WildFly 10.1(因此 Hibernate 版本是 5.0.10)和 Oracle 12c (12.2.0.1)。
提前感谢您的建议!
最佳答案
是的,SequenceGenerator
的 allocationSize
的值和数据库递增序列的步骤必须相同。
如果将 allocationSize
属性设置为 50,则告诉 Hibernate 该序列将递增 50,并且在从序列中选择下一个值之前它将在内部生成 49 个值。
如果您保持 allocationSize
和序列的增量同步,您就不必担心重复的 id。
比方说;你有 2 个服务器连接到同一个数据库。两个服务器都使用 50 的 allocationSize
,并且您将数据库序列配置为递增 50。
Server1 从序列中请求一个新值并得到 1000。它将在内部存储这个值并递增它直到达到 1049。
与此同时,Server2 从序列中请求一个新值并获得 1050。它将递增该值直到 1099。
数据库序列返回的下一个值将是 1100。如您所见,不会有重复的 ID。但是主键值之间可能存在间隙,您不能使用它们按时间顺序对数据库记录进行排序。但是无论如何你都不应该为此使用主键......
关于java - javax.persistence.SequenceGenerator.allocationSize() 应该和 INCREMENT BY 一致吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47972881/