我使用的是hibernate 3,oracle 10g。我有一張桌子:主題。該定義是這裏hibernate oracle序列產生大缺口
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
)
;
時插入一個新的課題,sub_seq用於創建一個主題ID
,分辨率爲這裏
create sequence sub_seq
MINVALUE 1
MAXVALUE 999999999999999999999999999
START WITH 1
INCREMENT BY 1
CACHE 100
NOCYCLE ;
Subject類是這樣的:
@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;
}
在主題表中,數據庫中有4555個主題由excel中的plsql腳本加載,sub_sequence正常工作。主題ID範圍從1-4555。
然而,當我使用Hibernate增加從我的應用程序中的主題, 序列號躍升至255050.運行後,由休眠這個樣子的
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
生成的被攝體IDS幾天有幾個大缺口:4555至255051,255067至260051,265057至270051
這是一種浪費而不是期望的行爲。
沒有人知道爲什麼會這樣,熱修復它
感謝
謝謝。是的,這可能是問題所在。那麼在我的情況下這裏休眠不應該使用oracle定義的序列對象?如何解決這個問題? – sse 2011-03-17 23:31:49
如果我記得安裝正確的話,你也可以從重新啓動中得到間隔,因爲db中的序列是1,2,3,4,如果分配大小是500,那麼當它得到下一個seq時,500 * 1 = 500,當它最後到999,它調用下一個序列檢索2(或3如果另一個進程已經2),然後500 * 2 = 1000一直到1499.服務器重新啓動後,只使用500或500中的值會導致一個溝。 – 2013-12-12 02:57:19
哦,並且當你調用persist並且不刷新時(如果在手動模式下)它使用從未保存到數據庫的序列中的id(有很多原因,因爲我只是注意到你沒有使用allocationSize我們使用ALOT來防止插入操作中的常量db交互,因爲它是更往返工作) – 2013-12-12 02:59:23