【问题标题】:Too Many Increment on Oracle Sequences by JPA/HibernateJPA/Hibernate 对 Oracle 序列的增量过多
【发布时间】:2012-02-24 06:01:55
【问题描述】:

我在我的 Java 项目中使用 Hibernate,我有 Oracle DB。一个 ID 列,我标识了一个增量为 1 的序列。但这就是 JPA/Hibernate 从序列中获取 nextVal 的方式:

1   1451
2   1450
3   1402
4   1401
5   1400
6   1352
7   1351
8   1350
9    426

您可以看到 nextVal 有时会得到 1,但大多是 50 或更多。即使我将起始值设为 1,我什至看到序列 200 的开头。为什么会发生这种情况?这正常吗?

我能以某种方式减少这个“50”增量吗?

编辑:hibernate oracle sequence produces large gap 的重复项

【问题讨论】:

标签: java oracle hibernate jpa sequence


【解决方案1】:

我找到了这个解决方案;

  1. 我将序列缓存设置为“无缓存”
  2. 我将“allocationSize=1”添加到@Id 属性的注释@SequenceGenerator 中,如下所述:https://stackoverflow.com/a/5346701/169534

问题已解决

【讨论】:

  • 我也是这样做的,增量从 50 减少到 2。但它仍然没有增加 1。知道可能是什么问题吗?
【解决方案2】:

如果您的序列的缓存大小为 50,如果数据库在您从序列中提取之间关闭,您可能会看到此问题。数据库关闭时,将永远不会使用剩余的缓存值。

【讨论】:

  • 不,即使“关闭”只发生在一些关键的高负载值上,DB 也不会如此频繁地关闭。
  • 您对缓存的看法是正确的,但不需要关闭数据库。基本上,Oracle 将缓存 50 个 nextval,如果不使用,可能会超出缓存。下次调用 nextval 时,将缓存另外 50 个值(丢弃缓存中的先前值)。
  • 如果我在序列上创建/更改缓存值作为“无缓存”,它会是一个解决方案吗?会不会是个问题?
猜你喜欢
  • 1970-01-01
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 2017-07-14
  • 2013-06-06
  • 1970-01-01
  • 2011-06-08
  • 1970-01-01
相关资源
最近更新 更多