Chinaunix首页 | 论坛 | 博客
  • 博客访问: 807831
  • 博文数量: 780
  • 博客积分: 7000
  • 博客等级: 少将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-09-12 09:11
文章分类

全部博文(780)

文章存档

2011年(1)

2008年(779)

我的朋友
最近访客

分类:

2008-09-12 09:13:01

    工作中常常遇到流水号生成的问题,有的客户要求流水号必须连续,这个我们的开发工作提出了一个小难题。

    解决方法如下:

    方法一:采用最大号表的形式

    在数据库中创建一个表专门存放其他数据库的最大流水号,table_maxOrderID  {table1_max,table2_max};

    在向数据库中插入数据的时候,首先想table_maxOrderId表查询到当前表的最大号加1,先更新最大号表,然后保存到业务数据。

    优点:效率高

    缺点:号码浪费大一些(例如保存的时候失败了,那么这个号码就浪费了。)

 

    方法二:采用抢号的形式

    这个不需要创建最大号表,在向数据库中保存数据的时候,获取当前表的最大流水号。例如:

    select max(ID) from tableName ;  让后将结果加一。

    优点:速度快,不浪费号码;

    缺点:并发的时候,号码重复造成数据无法保存。

    解决办法:抢号。如果保存失败,那么重复抢号例如:

    public synchronized String getOrderId(String shengid) {

        if (shengid == null || "".equals(shengid.trim())) {

            throw new NullPointerException("在获取流水号的时候,省id为空!获取流水号失败!");

        }

        // 首先查找所在地区查找企业表中有没有数据

        int num = xjqyDao.getCountBySql(" and qy_sheng='" + shengid + "'");

        String orderId = null;

        if (num == 0) {

            orderId = "0001";

        } else {

            //必须找到本省最大的档案的id

            String maxDabh = xjqyDao.getMaxDabhBySheng(shengid);

            num = Integer.parseInt(maxDabh.substring(6));

            String temp = (num + 1) + "";

            int LEN = temp.length();

            if (LEN > 4) {

                log.error("出错了!一个省的蚕茧收购加工企业的个数不能超过1万!");

                return null;

            }

            for (int i = 0; i < 4 - LEN; i++) {

                temp = "0" + temp;

            }

 

[1]   

【责编:landy】

--------------------next---------------------

阅读(627) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~