我在使用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)。
提前感谢您的建议!
答案 0 :(得分:3)
是的,allocationSize
的{{1}}的值以及数据库递增序列的步骤必须相同。
如果将SequenceGenerator
属性设置为50,则告诉Hibernate序列增加50并且在从序列中选择下一个值之前它将在内部生成49个值。
如果您保持allocationSize
并且序列的增量保持同步,则不必担心重复的ID。
让我们说;你有2台服务器连接到同一个数据库。两台服务器都使用50的allocationSize
,并且您将数据库序列配置为增加50。
Server1从序列中请求一个新值并获得1000.它将在内部存储该值并将其递增直到达到1049.
与此同时,Server2从序列中请求一个新值并得到1050.它会将此值递增到1099.
数据库序列返回的下一个值为1100.如您所见,不会有重复的ID。但主键值之间可能存在间隙,您无法按时间顺序对数据库记录进行排序。但是你不应该使用主键......