【问题标题】:Should javax.persistence.SequenceGenerator.allocationSize() be consistent with INCREMENT BY?javax.persistence.SequenceGenerator.allocationSize() 是否应该与 INCREMENT BY 一致?
【发布时间】:2018-06-06 23:01:41
【问题描述】:

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

提前感谢您的建议!

【问题讨论】:

  • 是的。如果它们不一样,你就会遇到这个问题。 Increment by 是序列的数据库设置,而 allocationSize 属性是 JPA 值,它告诉它可以使用多少个数字,然后必须返回序列以获得更多。

标签: java oracle hibernate jpa ojdbc


【解决方案1】:

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

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

如果您保持allocationSize 和序列的增量同步,则无需担心重复的 id。

比方说;您有 2 台服务器连接到同一个数据库。两台服务器都使用 50 的 allocationSize,并且您将数据库序列配置为递增 50。

Server1 从序列中请求一个新值并得到 1000。它会在内部存储这个值并递增它直到达到 1049。

同时,Server2 从序列中请求一个新值并获得 1050。它将增加这个值直到 1099。

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

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 1970-01-01
    • 2018-09-13
    • 2021-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-23
    • 1970-01-01
    相关资源
    最近更新 更多