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