JPA序列跳过值

3

我正在使用 Open JPA 2.0,WebSphere V8和数据库是DB2 V10。

使用以下语法创建序列

CREATE SEQUENCE "MYSCHEMA"."SEQ_TABLEA" AS INTEGER START WITH 1 INCREMENT BY 1 MINVALUE 1000 MAXVALUE 2147483647 NO CYCLE CACHE 100 ORDER;

我的实体类定义如下使用序列

@Entity
@Table(name="MYSCHEMA.SEQ_TABLEA")
public class MyEntity implements Serializable {

    @Id
    @SequenceGenerator(name="TABLEA_ID_GENERATOR", sequenceName="MYSCHEMA.SEQ_TABLEA")
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="TABLEA_GENERATOR")
    @Column(name="ID")
    private Integer myId;

    ..

在3到4天内多次插入表TABLEA后,我发现序列号跳过了许多值。带有序列创建的插入操作如下:1、2、3、100、101、102、103、104、105、200、201、202、300、301、302、303、304、305、306、307、308、309、310、400等等。
请问出了什么问题吗?我在插入时没有发现任何错误,也没有在此期间重启数据库。
2个回答

2

这是很正常的行为。序列器会预取/预留一段值(并在数据库中保存参数),但由于某种原因,它最终不会使用(保存实体)该值间隔中的所有值。稍后,当它到达所述间隔的最后一个值时,它将创建一个新的间隔,而不关心/重新检查先前间隔中的所有值是否已被使用完。


感谢您的回复。我只需要将序列逐个增加1。这是否意味着我应该将缓存减少到较低的值或者为0? - undefined
1
是的,你可以这样做,但我不确定这是Sequencer的主要目的。我认为它的主要目的是在使用它来自动生成ID时提供更好的性能,其中唯一的保证是每个生成的ID都是唯一的,而不是按顺序递增。这就是为什么Sequencer会预取ID的间隔(相比于为每个ID执行数据库查询,这显然更快),但并不能真正保证这些ID是连续的。你可以实现自己的Sequencer,以便在数据库中只有连续(没有间隙)的自动生成的ID。 - undefined

2
尝试在@SequenceGenerator注释中设置分配大小。 这指定在分配序列号时要增加的数量。
@SequenceGenerator(name="TABLEA_ID_GENERATOR", 
  sequenceName="MYSCHEMA.SEQ_TABLEA", allocationSize=1)

Java API

JPA中序列的好文章


糟糕,我没有意识到我的示例已经设置为1000,请尝试更新。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接