当指定为1时,Derby Auto递增100

时间:2015-08-04 08:23:01

标签: java spring auto-increment derby

在用于创建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.查询中是否有错误?

enter image description here

1 个答案:

答案 0 :(得分:7)

这是由于pre-allocation of values for auto-increment columns。 Derby是内存数据库,在数据库首次加载到内存时缓存自动递增值。然后,使用缓存生成自动增量列的未来值,而不是一次又一次地查询数据库。如果未正确关闭数据库,则缓存中未使用的值将永久丢失。

您有两种方法可以解决这个问题:

  1. ;shutdown=true添加到JDBC URL。这将在应用程序结束时关闭数据库。
  2. derby.language.sequence.preallocator属性设置为1(其默认值为100)。这将确保永远不会缓存列值。
  3. 请注意,大多数数据库对序列的行为类似。例如,H2具有完全相同的行为,但使用的缓存大小为32而不是像Derby那样的100