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 回答