论坛首页 入门技术论坛

用SerialNumber生成流水号

浏览 6372 次
该帖已经被评为新手帖
作者 正文
   发表时间:2009-09-28  

 

 

在很多程序的应用中,有许多的地方会用到流水号,我写了个专门用来生成流水号的类

 

 

使用:

 

SerialNumber sn=new SerialNumber();
sn.getSerialNum(tablename, column);//tablename 表名
                                                           //column 主键字段(流水号列)
sn.toString(num, length); //将指定的数字格式化  如:

sn.toString(1,4); //结果为0001
 

 

下面是SerialNumber类的源代码

 

package com.aiy.util;

import java.text.SimpleDateFormat;
import java.util.Date;

import com.aiy.base.DatabaseUtil;

/**
 * 
 * @author aiyanbo 
 * 
 */
public class SerialNumber {
	private String prefix="SN";
	private String timeFormat="yyMMdd";
	private int digit=4;
	
	public SerialNumber() {}
	
    public SerialNumber(String prefix) {
		this.prefix = prefix;
	}
    
	public SerialNumber(String prefix, String timeFormat, int digit) {
		if(digit<2)
			digit=2;
		this.prefix = prefix;
		this.timeFormat = timeFormat;
		this.digit = digit;
	}

	public synchronized String getSerialNum(String tablename,String column){
    	SerialSource ins=setInstace(tablename, column);
    	String date=getDate();
    	if(ins==null){
    		return prefix+date+toString(1, digit);
    	}
    	int max=getMax(ins.getSn());
    	return prefix+date+toString(max, digit);
    }
    private SerialSource setInstace(String tablename,String column){
    	DatabaseUtil<SerialSource> db=new DatabaseUtil<SerialSource>(SerialSource.class);
    	String sql="select top 1 "+column+" sn from "+tablename+" where "+column+" like '"+(prefix+getDate())+"%' order by "+column+" desc";
    	return db.queryOne(sql);
    }
    
    private String getDate(){
    	SimpleDateFormat format=new SimpleDateFormat(timeFormat);
    	Date date=new Date();
    	return format.format(date);
    }
    private int getMax(String sn){
    	return Integer.parseInt(sn.substring((prefix+getDate()).length()))+1;
    }
    public String toString(int num,int length){
    	String str="";
    	String numlen=""+num;
    	for(int i=length-(numlen.length());i>0;i-- ){
    		str=str+"0";
    	}
    	return str+num;
    }
}

 
   发表时间:2009-09-29  
直接用 java.util.concurrent.atomic.AtomicLong生成流水号  也不错吧~~
如果不是分布式系统的话
0 请登录后投票
   发表时间:2009-09-29  
我们系统的流水号是:yyyyMMdd-HHmmssSSS-XXXX,精确到毫秒,再加了4位随机数,这个若能重复,就碰墙去了。且从流水号可以看出操作时间
0 请登录后投票
   发表时间:2009-09-29  
其实很多系统都是整到纳秒级别,之后加随机数,毫秒级别的还是比较容易的,特别是在分布式的情况下。
0 请登录后投票
   发表时间:2009-09-30  
mwmw 写道
其实很多系统都是整到纳秒级别,之后加随机数,毫秒级别的还是比较容易的,特别是在分布式的情况下。

不过现在好像生成的那个纳秒数都是有错的 !! 不知道 大家注意到没
0 请登录后投票
   发表时间:2009-09-30  
java.util.concurrent.atomic.AtomicLong
好用。学习了。
0 请登录后投票
   发表时间:2009-09-30  
再次被雷倒了。
spring的不好用吗?
配一个:
maxValueIncrementer=org.springframework.jdbc.support.incrementer.MySQLMaxValueIncrementer
再配一个bean:
    <bean id="userIncrementer" class="${maxValueIncrementer}">
        <property name="dataSource" ref="dataSource"/>
        <property name="incrementerName" value="user_sequence"/>
        <property name="columnName" value="value"/>
    </bean>

人家的还有并发缓存控制。
0 请登录后投票
   发表时间:2009-09-30  
流水号应该能定制的,这样搞有啥用。。。。
0 请登录后投票
论坛首页 入门技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics