我用hibernate+spring+Oracle写了个小例子。Oracle里有个sequence,设置cache为20。
我知道如果数据库突然不正常down掉的话,sequence就会发生跳号现象。现在的问题是当我重启web服务器tomcat时,sequence也会跳号20个。oracle安装在另一台电脑上,并没有异常。大家说说,这个cache是存在于哪台电脑上的,为什么重启web服务器后丢失了?

解决方案 »

  1.   

    cache肯定存在oracle Server上面,只是你的应用程序里面可能有
    rollback操作,这样,你在重起tomcat的时候,导致rollback,相应的序列号已经分配出去,就会出现调号,再说,既然选择用sequence,就不要在乎跳号。
      

  2.   

    LZ可以这样不掉号:1.写个存贮过程,把sequence插入到一张表buf_id(id),一次选定id的初值和终值。如:从20081000001到2008103000;
    2.使用主表test时,先:insert into test(id) values select min(id) from buf_id;
    3.增加主表的实质内容采用update方式来进行。
      

  3.   


    为什么要把CACHE设置为20呢?  如果不想发生跳号的话可以设置为0或不用ORACLE 的sequence而创建个表去关联也可以的啊!
    再者说并不是ORACLE出现异常才会跳号的。
      

  4.   

    sequence是解决不了跳号的问题的,总是有可能跳号.设置为0也可能会跳号,如果同时两个用户去取值,其中一个业务正常操作成功,而另一个失败,这也会导致跳号的现象.
      

  5.   

    后来测了下,2,3两步可以合并,以原来的方式insert数据。
      

  6.   

    cache当然是在数据库服务器上了.
    重启web服务器和sequence的cache没有任何关系.
    要不你多重启几次web服务器(不要使用你的应用,仅仅重启web),看看是否sequence的nextval值是否有影响.
      

  7.   

    每次重启服务都会重新加载sequence吧,所以就会跳号,但是跳号不影响啥啊
      

  8.   

    仅仅重启tomcat是不跳号的,但是如果读取nextval后再重启tomcat就跳号了。跳不跳号我并不关心!!就是调试的时候,经常重启tomcat,看它跳号跳的我心惊肉跳的。
      

  9.   

    alter sequence you_seq_name nocache;
    这样还会跳号吗?
      

  10.   

    想问怎么阻止sequence跳号。最近看了一些有关oracle原理的资料,感觉重启web服务器不应该出现跳号的。
    所以就上来问问为什么出现这种情况,如果没有知道的,就当散分了。。