编程语言
首页 > 编程语言> > javax.persistence.SequenceGenerator.allocationSize()是否应与INCREMENT BY一致?

javax.persistence.SequenceGenerator.allocationSize()是否应与INCREMENT BY一致?

作者:互联网

我在使用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).

预先感谢您的建议!

解决方法:

是的,SequenceGenerator的allocationSize的值和数据库递增序列的步骤必须相同.

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

而且,如果您保持分配大小和序列的增量同步,则无需担心重复的ID.

比方说;您有2台服务器连接到同一数据库.两台服务器的分配大小均为50,并且您已将数据库序列配置为增加50.

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

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

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

标签:oracle,jpa,hibernate,ojdbc,java
来源: https://codeday.me/bug/20191110/2014052.html