奇怪的DB2 JPA序列生成

时间:2011-02-15 20:24:11

标签: spring jpa db2 eclipselink sequence

我发现使用eclipselink,spring和db的JPA项目中的序列不是连续生成的。 JPA似乎检索下一个缓存的序列号,即使当前序列号没有运行。

我的序列由此声明

创建
create or replace sequence MYSCHEMA.SEQ_MY_ID
as integer
  start with 1 increment by 1;

,序列的缓存为20。

我的应用程序每次运行时都需要两个MY_ID列的序列号。我期望的是这样的序列:

RUN #1
1
2
RUN #2
3
4

但实际上生成的序列号如下:

RUN #1
1
21
RUN #2
2
3
RUN #3
22
41

有两个线程同时运行以请求序列。但即使在多线程环境中,也应该连续生成序列。为什么使用下一个缓存值?我怎么能弄明白什么是罪魁祸首? DB2,JPA或Spring。

3 个答案:

答案 0 :(得分:1)

创建序列时使用NO CACHE选项,并且没有间隙。请注意,性能会稍差。

答案 1 :(得分:1)

我一般建议使用increment和allocationSize来预先分配id。这将大大提高性能。不确定为什么你不想要漏洞,但如果这是一个真正的要求,那么除了你的增量之外你还需要删除你的缓存选项。

答案 2 :(得分:0)

DB2序列具有名为“ORDER / NO ORDER”的选项,默认为“NO ORDER”。我想这就是原因,但我没有时间去测试它。将在测试后发布。