2012-07-25 120 views
8

我有這個簡單的表(只是爲了測試):在H2數據庫中,auto_increment字段增加32?

create table table 
(
key int not null primary key auto_increment, 
name varchar(30) 
); 

然後我執行以下要求:

insert into table values (null , 'one');// key=1 
insert into table values (null , 'two');// key=2 

在這個階段,一切順利的話,我關閉H2控制檯並重新打開它,並重新執行這一要求:

insert into table values (null , 'three');// key=33 

最後,這裏是所有的結果:

enter image description here

我不知道如何解決這個問題,如果它是一個真正的問題... 未決從作者的響應...

+0

你在截圖中使用了哪些軟件? – 2014-07-23 18:38:22

+0

保羅:camtasia工作室。 – 2014-07-23 19:08:00

+0

對不起!我的意思是數據庫瀏覽器。 :-) – 2014-07-23 19:54:37

回答

11

數據庫使用a cache of 32 entries for sequences,並自動遞增是內部實施了一個序列。如果系統崩潰而沒有關閉數據庫,則至多有很多數字會丟失。這與序列在其他數據庫中的工作方式類似。在這種情況下,序列值不能保證沒有間隙地產生。

那麼,你真的關閉了數據庫嗎?你應該 - 如果你不這樣做,技術上不是問題,但關閉數據庫將確保不會發生這種奇怪的事情。如果我通常關閉數據庫(停止H2控制檯工具),則無法重現該問題。關閉所有連接將關閉數據庫,並且如果應用程序正常停止(使用關閉掛鉤),數據庫將關閉。

順便說一句,你確切的數據庫URL是什麼?看起來你正在使用jdbc:h2:tcp://...,但我無法看到網址的其餘部分。

+0

您好Thomas,我使用這個URL:jdbc:h2:tcp:// localhost /〜/ autoin ...在我的帖子中我只是在玩H2 Console工具(因爲我有一個在我的軟件中的錯誤,但當我發現問題來自H2數據庫而不是來自JPA時,我感到很驚訝),「如果我平時關閉數據庫(停止H2控制檯工具),我無法再現問題」好吧,我錄製了一個視頻其中我關閉了控制檯,但問題仍然存在,請參閱:http://www.youtube.com/watch?v=pGuDjgbTr7o&feature=youtu.be – 2012-07-25 21:12:33

+0

視頻錯誤報告,不錯:-)當您關閉控制檯窗口' h2 - Raccourci'在0:53(我猜這是服務器和H2 Console工具,但我不確定),我認爲'殺死'了該進程,並且數據庫沒有機會正常關閉自己(沒有關機鉤子被叫,連接沒有正常關閉)。 – 2012-07-26 05:00:15

+0

如果這不是一個技術問題,是否有機會解決這個問題?我被困在這個階段,時間不多了...... – 2012-07-26 07:44:06

0

請勿關閉終端。終端是h2-tcp-server的父進程。他們不分離。當你剛剛關閉終端,它的進程關閉了所有的子進程,這意味着緊急服務器關機