比如格式为:
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">