nextval之后,Oracle序列不增加

时间:2019-07-08 08:35:28

标签: sql oracle sequence

调用Oracle序列nextval似乎是不规则的。我们的业务约束(唯一令牌)是生成唯一编号,因此我们使用oracle序列。我们使用休眠的Spring Boot应用程序。但是,在这种情况下,我们通过本机查询(JDBC)调用nextval,因此不会进行休眠管理。但是,在生产中运行该应用程序一段时间后,由于oracle序列尝试生成相同的序列号或一段时间后它不会增加序列值,因此唯一令牌会获得唯一约束异常。 在我们所有的唯一标记中,序列值差异类似于1或2。但是,如果序列值不增加(在nextval上),则手动序列增加2494(缓存1000个ORDER)。我们的序列值为ORDER,但停留在某些值中,需要增加2494才能保持唯一性

我们的序列定义如下:

CREATE SEQUENCE SEQ_98090 INCREMENT BY 1 CACHE 1000 ORDER NOCYLE NOPARTITION;

为解决此问题,我们手动增加了序列值,以使我们的唯一业务约束(唯一令牌)不会获得任何唯一约束异常。

我们的应用程序在多台服务器上运行。

我们从外部调试序列值,我们看到oracle序列值没有增加。

CREATE SEQUENCE SEQ_98090 INCREMENT BY 1 CACHE 1000 ORDER NOCYLE NOPARTITION;
String queryString = "SELECT " + dbSequence + ".NEXTVAL FROM DUAL";
Query query = em.createNativeQuery(queryString);
BigDecimal issuedTokenBin = null;
try {
    issuedTokenBin = (BigDecimal) query.getSingleResult();
} catch (Exception ex) {
    log.error("Error :", ex);
}

当我们从oracle序列获取序列时,它应该始终返回递增的值。

From TID value 3009053444 to next TID 3009091522, last part of unique token i.e. oracle sequence stuck. Unless we manually increase it

从图中:Oracle序列卡在第一行选定的行中(应用程序违反了唯一约束)。然后,我们手动增加它,然后应用程序开始运行。唯一令牌的后8位,即79140和81634来自oracle序列。

2 个答案:

答案 0 :(得分:-2)

您是否真的需要按顺序缓存。如何使用以下内容:

以1个Nocache Order Nocycle创建序列SEQ_TEST增量;

问候 阿卡什(Akash)

答案 1 :(得分:-2)

序列缓存的总体好处是速度:缓存值越高,Oracle必须进入数据库并获得序列缓存的次数越少。缓存的负面影响是,一旦存在序列缓存,如果重新启动数据库,Oracle将放弃缓存中的所有值。

因此,如果您不想在序列值中留下空白,则必须通过将序列设置为NOCACHE来付出代价。