在使用查询中创建derby数据库表由主列自动增量组成.
CREATE TABLE \"table\" (\n"
+ " \"id\" INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1) NOT NULL,\n"
+ " \"path\" VARCHAR(2000) DEFAULT NULL,\n"
+ " \"downloaded\" BOOLEAN DEFAULT false NOT NULL,\n"
+ " \"retried_times\" SMALLINT DEFAULT 0 NOT NULL,\n"
+ " \"name\" VARCHAR(40),\n"
+ " \"downloaded_date\" TIMESTAMP DEFAULT NULL,\n"
+ " PRIMARY KEY (\"id\")\n"
当我通过spring jdbc插入一行时,它会增加100.查询中是否有任何错误?
解决方法:
这是由于pre-allocation of values for auto-increment columns. Derby是一个内存数据库,在数据库首次加载到内存时缓存自动增量值.然后,使用缓存生成自动增量列的未来值,而不是一次又一次地查询数据库.如果数据库未正确关闭,则缓存中未使用的值将永久丢失.
您有两种方法可以解决此问题:
> Add; shutdown = true到JDBC URL.这将在应用程序结束时关闭数据库.
>将derby.language.sequence.preallocator属性设置为1(其默认值为100).这将确保永远不会缓存列值.
请注意,大多数数据库对序列的行为类似.例如,H2具有完全相同的行为,但使用的缓存大小为32而不是像Derby那样的100.
标签:java,spring,auto-increment,derby
来源: https://codeday.me/bug/20190611/1221996.html