日期:2014-05-18  浏览次数:20737 次

怎样生成唯一订单号
比如格式为:

yyyy-MM-dd + 00000001,
yyyy-MM-dd + 00000002,
yyyy-MM-dd + 00000003,
...

yyyy-MM-dd是订单产生日日期,后跟8位数字,每天都是从00000001开始。

大家都有什么好方法,能保证唯一性和速度。

------解决方案--------------------
从年月日到时间 ,,取到毫秒
------解决方案--------------------
上面说用时间来取唯一值不行吧,如果访问量很大,同一毫秒上来的订单那不是会重复了呢?

比较严谨的做法用一个自动增长的表来产生一个唯一值。

------解决方案--------------------
办法有,有点小麻烦。 

首先定义一个工厂类,生成你的订单号序列。

package bean;

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

import org.springframework.beans.factory.FactoryBean;


public class SequenceFactoryBean implements FactoryBean<String> {

private static long counter = 0;

public synchronized String getObject() throws Exception {
String date = new SimpleDateFormat("yyyy-MM-dd").format(new Date()) + " + ";
String sequ = new DecimalFormat("00000000").format(counter ++);
return date + sequ;
}

public Class<String> getObjectType() {
return String.class;
}

public boolean isSingleton() {
return false;
}

public static void reset() {
SequenceFactoryBean.counter = 0;
}
}


注意里面的静态方法 reset方法, 这个用来在每天00:00:00重置。
这个方法由任务调度框架Quartz调用。

首先定义一个job

package job;

import bean.SequenceFactoryBean;

public class SequenceResetJob {

public void execute() {
SequenceFactoryBean.reset();
}
}


配置Quartz,在每天零点触发触发器就可以了。 

Spring 的配置文件。 

<bean id="sequence" class="bean.SequenceFactoryBean" />

<bean id="job" class="job.SequenceResetJob" />

<bean id="jobDetail"
class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean">