定义Sequence时,如果使用缓存,在数据库关闭或者宕掉时,将出现Sequence跳号。
要解决ADF程序中的sequence断号,首先要确保Oracle数据库中不产生断号。
1,对于非频繁使用的Sequence,可以在定义中加NOCACHE,即不缓存。这样数据库中不会出现断号了。
2,对于频繁使用的Sequence,定义的时候又使用了CACHE。可以使用DBMS_SHARED_POOL来KEEP SEQUENCE的CACHE。
命令如下:
exec dbms_shared_pool.keep(name => 'myseq', flag => 'Q')
测试:
1)未设置DBMS_SHARED_POOL
SQL> create sequence myseq cache 100;
序列已创建。
SQL> select myseq.nextval from dual;
NEXTVAL
----------
1
SQL> conn / as sysdba
已连接。
SQL> alter system flush shared_pool;
系统已更改。
SQL> conn hr/hr
已连接。
SQL> select myseq.nextval from dual;
NEXTVAL
----------
101
2)设置DBMS_SHARED_POOL
SQL> conn / as sysdba
已连接。
SQL> exec dbms_shared_pool.keep(name => 'hr.myseq',flag => 'Q');
PL/SQL 过程已成功完成。
SQL> alter system flush shared_pool;
系统已更改。
SQL> conn hr/hr
已连接。
SQL> select myseq.nextval from dual;
NEXTVAL
----------
102
3,为了避免ADF应用程序中不断点击新增按钮产生的Sequence断号,可以使用定义字段类型为DBSequence并结合Trigger的技巧。
ADF中使用DBSequence的方法可参考我的另一篇文章:ADF 中使用Sequence的方法总结