java - javax.persistence.SequenceGenerator.allocationSize() 应该和 INCREMENT BY 一致吗?

标签 java oracle hibernate jpa ojdbc

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

提前感谢您的建议!

最佳答案

是的,SequenceGeneratorallocationSize 的值和数据库递增序列的步骤必须相同。

如果将 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/

相关文章:

java - MediaRecorder:setCamera() - 错误相机不可用

java - 分发可执行 Jar 控制台应用程序

java - GSON 避免 JsonSyntaxException 返回部分映射

sql - 创建一个新表,第一行作为旧表的列名

mysql - 在没有 native 查询的情况下在 JPA 中更新

java - 动态响应格式依赖于 Jersey 的查询参数?

java - oracle Jdbc更新语句返回零

oracle - 亚马逊 RDS Oracle : impdp REMAP_SCHEMA

sql - 关于 Hibernate 的新手问题......在 Martin Fowler 文章的背景下

java - 调用 "new Configuration().configure().buildSessionFactory()"中的方法时发生 com.sun.jdi.InitationException