11

私はこの単純なテーブルを持っています(テスト用です):

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

最後に、すべての結果は次のとおりです。

ここに画像の説明を入力してください

それが本当の問題であるならば、私はこの問題を解決する方法を知りません...作者からの応答を待っています...

4

2 に答える 2

15

データベースはシーケンスに32エントリのキャッシュを使用し、自動インクリメントはシーケンスの内部で実装されます。データベースを閉じずにシステムがクラッシュした場合、多くてもこれだけの数が失われます。これは、他のデータベースでシーケンスがどのように機能するかと似ています。このような場合、シーケンス値がギャップなしで生成されることは保証されません。

それで、あなたは本当にデータベースを閉じましたか?そうしなくても技術的には問題ありませんが、データベースを閉じることで、このような奇妙なことが起こらないようにすることができます。通常データベースを閉じた場合(H2コンソールツールを停止した場合)、問題を再現できません。すべての接続を閉じるとデータベースが閉じ、アプリケーションが正常に停止した場合(シャットダウンフックを使用)、データベースが閉じられます。

ちなみに、あなたの正確なデータベースURLは何ですか?使用しているようですがjdbc:h2:tcp://...、残りのURLが表示されません。

于 2012-07-25T18:05:02.707 に答える
0

ターミナルを閉じないでください。ターミナルはh2-tcp-serverの親プロセスです。それらは切り離されていません。ターミナルを閉じるだけで、そのプロセスはすべての子プロセスを閉じます。これは、サーバーの緊急シャットダウンを意味します

于 2013-05-05T13:41:42.990 に答える