我发现使用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。
答案 0 :(得分:1)
创建序列时使用NO CACHE选项,并且没有间隙。请注意,性能会稍差。
答案 1 :(得分:1)
我一般建议使用increment和allocationSize来预先分配id。这将大大提高性能。不确定为什么你不想要漏洞,但如果这是一个真正的要求,那么除了你的增量之外你还需要删除你的缓存选项。
答案 2 :(得分:0)
DB2序列具有名为“ORDER / NO ORDER”的选项,默认为“NO ORDER”。我想这就是原因,但我没有时间去测试它。将在测试后发布。