【问题标题】:Hibernate Sequence Generator is not Consistent休眠序列生成器不一致
【发布时间】:2015-01-14 03:10:38
【问题描述】:

我有一张带有注释为促销 id 的表格

@SequenceGenerator(name="GEN_PROMID", sequenceName="SEQ_PROMOTIONID", allocationSize=1)
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="GEN_PROMID")
@Column(name="PROMOTIONID")
private Long promotionid;

但即使将 allocationSize 指定为 1,hibernate 也会不一致地增加数字。以下是数据库中promotionid 的最新降序值

1440
1420
1407
1406
1405
1404
1403
1402
1401
1400
1380
1360
1342
1341
1340
1320
1305

我在某处读到 Hibernate 可能会使用 hilo seq_hilo algotihm 和 org.hibernate.id.SequenceHiLoGenerator 生成器,即使定义了 @SequenceGenerator。另请阅读以下链接,我们可以使用@GenericGenerator 来解决链接中的此问题

有人可以在这种情况下提供详细信息吗? @GenericGenerator 语法看起来并不简单。是否应使用@SequenceGenerator。有时@SequenceGenerator 可以完美运行并生成正确的主键。

PS。我正在使用 Hibernate 3.5 和 Oracle 11g DB

编辑

序列码-

CREATE SEQUENCE SEQ_PROMOTIONID
    INCREMENT BY 1
    START WITH 100;

编辑 2

更多分析表明,“总是”插入至少一个可被 20 整除的值。由于 Oracle 的序列默认缓存为 20,因此在正常的 hibernate 增量和缓存值之间看起来有些冲突。还观察到,当插入之间有时间间隔时,它会转到下一个可被 20 整除的值,否则会适当地增加到 1

1440    12-NOV-14 09.33.09.686000000 AM
1420    07-NOV-14 07.21.41.238000000 AM
1407    03-NOV-14 11.40.41.508000000 AM
1406    03-NOV-14 11.31.37.341000000 AM
1405    03-NOV-14 04.57.53.356000000 AM
1404    03-NOV-14 04.56.39.074000000 AM
1403    03-NOV-14 04.55.17.741000000 AM
1402    03-NOV-14 04.30.59.980000000 AM
1401    03-NOV-14 04.27.14.016000000 AM
1400    03-NOV-14 04.19.23.736000000 AM
1380    27-OCT-14 11.06.33.360000000 AM
1360    17-OCT-14 11.59.15.738000000 AM
1342    15-OCT-14 01.57.50.253000000 PM
1341    15-OCT-14 01.55.39.173000000 PM
1340    14-OCT-14 07.07.14.283000000 AM
1320    10-OCT-14 10.41.04.766000000 AM
1305    07-OCT-14 11.08.10.388000000 AM
1304    07-OCT-14 05.00.50.295000000 AM
1303    07-OCT-14 04.59.01.434000000 AM
1302    06-OCT-14 11.34.43.012000000 AM
1301    06-OCT-14 11.31.18.855000000 AM
1300    06-OCT-14 11.27.16.237000000 AM
1280    04-OCT-14 04.47.40.391000000 AM
1261    01-OCT-14 05.09.06.291000000 PM
1260    01-OCT-14 10.18.41.060000000 AM
1241    22-SEP-14 07.04.45.593000000 AM
1240    22-SEP-14 04.57.25.289000000 AM
1220    19-SEP-14 06.55.31.450000000 AM
1200    16-SEP-14 09.03.04.763000000 AM
1181    10-SEP-14 07.44.04.115000000 AM
1180    08-SEP-14 11.05.30.590000000 AM
1168    04-SEP-14 05.09.46.000000000 AM
1167    02-SEP-14 07.47.52.454000000 AM
1166    02-SEP-14 07.46.52.043000000 AM
1165    02-SEP-14 07.45.38.323000000 AM
1164    02-SEP-14 07.43.27.562000000 AM
1163    02-SEP-14 07.41.11.702000000 AM
1162    02-SEP-14 07.39.27.336000000 AM
1161    02-SEP-14 07.37.35.561000000 AM
1160    02-SEP-14 07.36.12.776000000 AM
1140    28-AUG-14 06.09.08.346000000 AM
1122    25-AUG-14 09.15.51.112000000 AM
1121    25-AUG-14 09.14.30.789000000 AM
1120    25-AUG-14 09.12.54.710000000 AM
1100    20-AUG-14 05.46.08.394000000 AM
1080    14-AUG-14 10.44.54.917000000 AM
1061    09-AUG-14 06.00.43.708000000 AM
1060    07-AUG-14 02.12.24.893000000 PM
1042    04-AUG-14 07.34.57.224000000 AM
1041    04-AUG-14 07.32.16.555000000 AM
1040    04-AUG-14 07.28.34.526000000 AM
1021    01-AUG-14 11.45.22.141000000 AM
1020    31-JUL-14 09.46.17.765000000 AM
1002    23-JUL-14 01.33.45.940000000 AM
1001    22-JUL-14 11.07.54.784000000 AM
1000    21-JUL-14 06.50.43.991000000 AM

【问题讨论】:

  • 可以发SEQ_PROMOTIONID DDL 代码吗?
  • @PredragMaric,已经用序列码更新了问题
  • 只是为了确保 - 您的工作流程是否涉及行删除?
  • This SO thread 似乎包含有关此的信息,希望它能帮助您解决此问题。
  • 您可以尝试设置 NOCACHE 并检查行为,但如果在测试期间服务器重新启动,那么这些差距可能是由此造成的。在每次读取时缓存 20 个值,您使用一对并重新启动服务器,另外 20 个被缓存,依此类推...

标签: oracle hibernate hilo sequence-generators jpa-annotations


【解决方案1】:

序列生成器一致的。它的唯一任务是生成唯一的整数值,仅此而已。为什么你会被这种行为困扰?

如前所述,此行为是由 oracle 缓存、预分配、序列号(默认为 20)引起的。 ID 列是代理/人工主键,仅用于唯一标识行,不应从中派生任何信息。即使您不缓存序列号,由于回滚事务、删除、应用程序和数据库服务器重新启动,您也永远不会获得不间断的一系列 ID。并且不缓存序列会对大容量事务系统造成严重的性能损失。

所以忽略它,没关系,没有错。没有无间隙序列生成器之类的东西......

【讨论】:

  • 之前我不太明白 Hibernate 在缓存时增加了序列,但现在看起来很明显。混乱的产生是因为有另一个序列没有缝隙,但后来意识到它使用得太频繁了,缝隙不容易穿透。谢谢罗伯特!
  • 我观察到的是 Hibernate 使用序列的 nextVal 并将其乘以分配大小,如果未指定大小,则为 50,对于每个会话,然后递增 1。如果指定 1,则它们具有相同价值。你能澄清一下这种行为吗?
  • @abhihello123 看到这个stackoverflow.com/questions/12745751/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-19
  • 2015-05-18
  • 1970-01-01
  • 1970-01-01
  • 2022-11-02
相关资源
最近更新 更多