【问题标题】:Jpa hibernate sequence pre allocationjpa hibernate序列预分配
【发布时间】:2012-09-16 21:20:20
【问题描述】:

我一直在浏览 JPA 文档并在分配序列 id 时遇到了预分配的事情。

虽然出于明显的性能原因它非常好。 但我正在考虑它可能会搞砸事情的场景。

据我了解,当我们在使用表排序或排序对象作为生成序列的策略时设置分配大小=100 时,像 hibernate 或 Eclipse 链接这样的持久性提供程序将维护内存计数器,而用于插入记录的应用程序代码不会有为每个插入去数据库。

当该内存计数器达到 100 时,数据库序列增加 100 并且相同的故事继续。 到目前为止一切顺利。

但是假设我们在生产中遇到了一个错误,我们发现某些表中的记录没有被插入到数据库中。

所以我们准备了将这些记录插入数据库的脚本,现在我们为表的主键赋予什么值。如果我们从数据库中获取值,很有可能在应用程序尝试时会发生冲突使用内存计数器插入记录并会给出 SQL 异常。

有人遇到过这样的问题吗? 处理这种情况的最佳方法是什么?

【问题讨论】:

    标签: hibernate orm jpa-2.0 eclipselink


    【解决方案1】:

    只要确保在脚本中使用与 Hibernate 生成器相同的策略即可。例如,如果序列位于 2300,并且 Hibernate 生成器将序列增加 100 并生成 ID 2301 到 2400 而不转到序列,请在脚本中执行相同操作。

    或者停止应用程序,运行您的脚本,然后使用一个值重新生成序列,以保证 Hibernate 生成器不会生成已使用的 ID。

    【讨论】:

    • 关于您的第一种方法。我的脚本无法访问休眠内存计数器。因此,如果计数器位于 2350。数据库位于 2300。在这种情况下,脚本应使用什么 ID。如果它从 2301 开始使用,它肯定会失败。如果它从 2350 之后的任何内容开始,它将正常工作,直到应用程序开始使用其内存计数器使用 id 并且将失败。
    • 如果您知道 Hibernate 占用 100 个 ID 的插槽,并且数据库位于 2300,则像 Hibernate 生成器一样将序列增加到 2400,并使用从 2400 到 2499 的 ID。当 Hibernate 没有内存中没有空闲ID,它会去数据库,将序列递增到2500,并生成从2500到2599的ID。没有冲突。
    猜你喜欢
    • 2010-09-21
    • 2014-07-21
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多