本帖最后由 northenwolf1 于 2009-08-20 10:55:57 编辑

解决方案 »

  1.   

    我已经用public synchronized static String makeSequence()把整个类都锁定了呀!难道还没有把xh_index锁定吗?
      

  2.   

    你这里用的是static的 根本就没东西给你锁
      

  3.   

    程序未必有问题,但是整个事务逻辑可能有问题:首先你的过程A取到一个最大值,执行其他事务,并没有插入到数据库中,这个时候,另一个过程B又在取最大值了,这时候,这两个序列是一样的如果是oracle,建议你的6位数的流水号通过 sequence来取
      

  4.   

    A取到一个最大值,执行其他事务,并没有插入到数据库中,这时候B又在取最大值了,但A取完时已经对静态变量加1了,B在取的时候是取静态变量中的最大值,并没有到数据库中去取呀,这跟A有没有保存到数据库已经没有关系了吧!?
    只有在服务器刚启动时才从数据库中取最大值,其它时候都是从内存中的static变量中取到的呀!
      

  5.   

    我已经用public synchronized static String makeSequence()把整个Sequence类都锁定了呀!
      

  6.   

    makeSequence中的 重新从数据库取出序列是什么意思?如果序列是预先储存在数据库中,那么这个序列就不应该是重复,如果这个序列是你生成的序列号的一部分且在库中并不会出现重复,那么怎么会在新生成的流水号中重复???
      

  7.   

    重新从数据库取出序号是在服务器重启时从数据库中取出最大的流水号,并初始化静态变量,数据库记录如:
    regid                ...(其它列略)  xh_index  xh_year
    ls200908000001RBrb             1        2009
    ls200908000002RBrb              2        2009在服务器启动后第一次取流水号是要从数据库中取,执行select top 1 xh_index from cx_reg where xh_year='2009' order by xh_index desc
    把得到的最大流水号取出并赋给静态变量xh_index,以后再生成时就直接makeSequence()把xh_index自增1作为新的序列号,并组合成regid,并把这个序号同时保存到此条记录中!
    现在的问题是在以后的操作中仍然有生成适于重复的xh_index至数据库记录中
      

  8.   

    重复的xh_index????我的理解是重启后从新取出序列号的索引值xh_index? RIGHT?看你的流水号的组合公式,里面有6位的流水号,那么这个流水号是否能够重复,以16进制来表示的话,这个6位所能表示的范围是多少,是不是从这个上面再做做文章还有那个索引值与生成的号码之间有没有显性的关系?
      

  9.   

    流水号是字符类型啊!跟进制有什么关系?!!!
    需要有6位的序列号,而序列为是1,就在前面补5个0就是6位,10的话前面就补4个0,依此类推,再加上前缀后缀就是完整的流水号喽,而且序列是每年归一次0,
    完整的流水号和序列在数据库记录中分别有保存
    如果一个流水号为ls200908000001rb则对应的数据库记录中regid(完整流水号)保存的就是ls200908000001rb,xh_index(序列)字段保存的为1,xh_year(年份)保存的为2009,说清楚了吗?!
      

  10.   

    public class Count{
            int n;
            static Count instance;
            private Count(){
                n = 0;
            }
            public static Count getInstance(){
                if(instance == null){
                    instance = new Count();
                }
                return instance;
            }
            public synchronized int getN(){
                 n++;
                 return n;
            }
    }
      

  11.   

    把得到的最大流水号取出并赋给静态变量xh_index,以后再生成时就直接makeSequence()把xh_index自增1作为新的序列号,并组合成regid,并把这个序号同时保存到此条记录中!在你的代码中,没看到哪里把xh_index放回数据库.那么下次重启web服务器,又拿到上次的所谓最大值,不就重复了么? 也许你应该在服务器关闭的时候把这个静态变量xh_index更新回数据库.(应该是用ServletContextListener吧)