В базе Н2, поле автоинкремент увеличивается на 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

Я не знаю, как решить эту проблему, если это реальная проблема... до получения ответа от автора...

2 ответов


база данных использует кэш 32 записей для последовательностей, и auto-increment внутренне реализована последовательность. Если система аварийно завершает работу без закрытия базы данных, не более этого числа теряются. Это похоже на то, как последовательности работают в других базах данных. В таких случаях не гарантируется, что значения последовательности будут генерироваться без пробелов.

Итак, вы действительно закрыли базу данных? Вы должны - это не технически проблема, если вы этого не сделаете, но закрытие база данных гарантирует, что такие странные вещи не произойдут. Я не могу воспроизвести проблему, если я обычно закрываю базу данных (остановите инструмент консоли H2). Закрытие всех подключений приведет к закрытию базы данных, и база данных будет закрыта, если приложение остановлено нормально (с помощью крючка выключения).

кстати, каков ваш точный URL базы данных? Кажется, вы используете jdbc:h2:tcp://... но я не вижу остальную часть URL.


Не закрывайте терминал. Терминал является родительским процессом H2-tcp-сервера. Они не отстранены. Когда вы просто закрываете терминал, это процесс закрывает все дочерние процессы, что означает аварийное завершение работы сервера