hibernate oracle序列产生很大的差距 [英] hibernate oracle sequence produces large gap

查看:130
本文介绍了hibernate oracle序列产生很大的差距的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用的是hibernate 3,oracle 10g。我有一张桌子:主题。定义在这里

  CREATE TABLE SUBJECT 

SUBJECT_ID NUMBER(10),
FNAME VARCHAR2(30)not null,
LNAME VARCHAR2(30)not null,
EMAILADR VARCHAR2(40),
BIRTHDT DATE不为空,
约束pk_sub主键(subject_id)使用INDEX TABLESPACE data_index

;

插入新主题时,sub_seq用于创建主题ID, p>

  create sequence sub_seq 
MINVALUE 1
MAXVALUE 999999999999999999999999999
从1开始
INCREMENT BY 1
CACHE 100
NOCYCLE;

Subject类是这样的:



<$

@Id
@Table(name =ktbs.syn_subject)
public class Subject {

@ Column(name =subject_id)
@GeneratedValue(strategy = GenerationType.SEQUENCE,generator =SUB_SEQ)
@SequenceGenerator(name =SUB_SEQ,sequenceName =SUB_SEQ)
私人长期subjectId;
private String fname;
private String lname;
私人字符串emailadr;
私人日期birthdt;
}

在主题表中,数据库中有4555个主题由plsql从excel和sub_sequence脚本工作正常。然而,当我从我的应用程序添加一个主题使用休眠,
序列号跳到255050.几个后,几天运行,由hibernate生成的主题ID看起来像这样

  270079 
270078
270077
270076
270075
270074
270073
270072
270071
270070
270069
270068
270067
270066
270065
270064
270063
270062
270061
270060
270059
270058
270057
270056 b b 270055 b b 270054 b b 270053 b b 270052 b b 270051 b b 270050 b b 265057 b b 265056 b b 265055 b $ b 265054
265053
265052
265051
265050
260059
260058
260057
260056
260055
260054
260053
260052
260051
260050
255067
255066
255065
255064
255063
255062
255061
255060
255059
255058
255057
255056
255055
255054
255053
255052
255051
255050
4555
4554
4553




1

有几个很大的差距:4555到255051,255067到260051,265057到270051

这是浪费,而不是理想的行为。

有人知道为什么会发生这种情况,而且很热修复它



谢谢

解决方案

我认为问题来自序列生成器实际上不是一个序列生成器,而是一个序列hilo生成器,默认分配大小为50,如文档所示: http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping-标识符



这意味着如果序列值是5000,则下一个生成的值将是5000 * 50 = 250000.将序列的缓存值添加到这个等式,它可能会解释你巨大的初始差距。

检查序列的值。它应该小于最后生成的标识符。注意不要将序列重新初始化为最后生成的值+ 1,因为生成的值将呈指数增长(我们遇到了这个问题,并且由于溢出而产生负整数ID)。

I am using hibernate 3 , oracle 10g. I have a table: subject. The definition is here

CREATE TABLE SUBJECT
    ( 
     SUBJECT_ID NUMBER (10), 
     FNAME VARCHAR2(30)  not null, 
     LNAME VARCHAR2(30)  not null, 
     EMAILADR VARCHAR2 (40),
     BIRTHDT  DATE       not null,
     constraint pk_sub primary key(subject_id) USING INDEX TABLESPACE data_index
    ) 
;

when insert a new subject, sub_seq is used to create an subject id, the definition is here

create sequence sub_seq
       MINVALUE 1 
       MAXVALUE 999999999999999999999999999 
       START WITH 1
       INCREMENT BY 1 
       CACHE 100 
       NOCYCLE ;

the Subject class is like this:

@Entity
@Table(name="ktbs.syn_subject")
public class Subject {

    @Id 
    @Column(name="subject_id")
    @GeneratedValue(strategy=GenerationType.SEQUENCE, generator="SUB_SEQ")
    @SequenceGenerator(name="SUB_SEQ", sequenceName = "SUB_SEQ")
    private long subjectId;
    private String fname;
    private String lname;
    private String emailadr;
    private Date birthdt;
}

in the subject table , there have been 4555 subjects in the database loaded by plsql scripts from excel and the sub_sequence worked fine. subject ids range from 1--4555.

however, when i added a subject from my application using hibernate, the sequence number jumped to 255050. After several days running, the subject ids generated by hibernate look like this

270079
270078
270077
270076
270075
270074
270073
270072
270071
270070
270069
270068
270067
270066
270065
270064
270063
270062
270061
270060
270059
270058
270057
270056
270055
270054
270053
270052
270051
270050
265057
265056
265055
265054
265053
265052
265051
265050
260059
260058
260057
260056
260055
260054
260053
260052
260051
260050
255067
255066
255065
255064
255063
255062
255061
255060
255059
255058
255057
255056
255055
255054
255053
255052
255051
255050
4555
4554
4553
.
.
.
.
1

There are several large gaps: 4555 to 255051, 255067 to 260051, 265057 to 270051

this is a waste and not a desired behavior.

does anyone know why this happens and hot to fix it

Thanks

解决方案

I think that the problem comes from the fact that the sequence generator is not really a sequence generator, but a sequence hilo generator, with a default allocation size of 50. as indicated by the documentation : http://docs.jboss.org/hibernate/stable/annotations/reference/en/html_single/#entity-mapping-identifier

This means that if the sequence value is 5000, the next generated value will be 5000 * 50 = 250000. Add the cache value of the sequence to the equation, and it might explain your huge initial gap.

Check the value of the sequence. It should be less than the last generated identifier. Be careful not to reinitialize the sequence to this last generated value + 1, because the generated valus would grow exponentially (we've had this problem, and had negative integer ids due to overflow)

这篇关于hibernate oracle序列产生很大的差距的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆