H2数据库使用GenerationType.IDENTITY时@Id跳号问题求助
H2数据库IDENTITY ID重启后跳跃的原因及解决办法
核心原因
H2数据库的IDENTITY类型自增列默认启用了ID预分配缓存机制:为了提升性能,H2会提前在内存中预分配一批连续的ID(默认缓存大小为32),每次新增数据时直接从缓存取ID,无需每次都写入磁盘更新自增计数器。
当你重启数据库时,内存里未使用的缓存ID会丢失,但H2的自增计数器会保留上次预分配的终点值。比如你之前用到ID=3时重启,此时预分配的ID范围是1-32,重启后H2会从33开始分配下一批ID,就出现了从3跳到33的情况。
验证方式
你可以在H2控制台执行以下SQL查看当前自增计数器的值:
SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '你的表名' AND COLUMN_NAME = 'id';
执行后会看到结果是33,而非你实际用到的最大ID(3)。
可选解决办法
如果需要ID严格连续,可以修改H2的连接URL,禁用预分配缓存:
jdbc:h2:file:./DATA/你的数据库名;AUTO_INCREMENT_CACHE_SIZE=1
设置AUTO_INCREMENT_CACHE_SIZE=1后,H2每次只会预分配1个ID,重启后会从实际已使用的最大ID+1开始分配。注意,这会略微降低ID生成的性能,但对小型项目几乎无影响。
内容的提问来源于stack exchange,提问作者Morrango
相关产品推荐
相关产品推荐

