调用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序列获取序列时,它应该始终返回递增的值。
从图中:Oracle序列卡在第一行选定的行中(应用程序违反了唯一约束)。然后,我们手动增加它,然后应用程序开始运行。唯一令牌的后8位,即79140和81634来自oracle序列。
答案 0 :(得分:-2)
您是否真的需要按顺序缓存。如何使用以下内容:
以1个Nocache Order Nocycle创建序列SEQ_TEST增量;
问候 阿卡什(Akash)
答案 1 :(得分:-2)
序列缓存的总体好处是速度:缓存值越高,Oracle必须进入数据库并获得序列缓存的次数越少。缓存的负面影响是,一旦存在序列缓存,如果重新启动数据库,Oracle将放弃缓存中的所有值。
因此,如果您不想在序列值中留下空白,则必须通过将序列设置为NOCACHE来付出代价。