比如格式为:yyyy-MM-dd + 00000001,
yyyy-MM-dd + 00000002,
yyyy-MM-dd + 00000003,
...yyyy-MM-dd是订单产生日日期,后跟8位数字,每天都是从00000001开始。大家都有什么好方法,能保证唯一性和速度。

解决方案 »

  1.   

    Date d=new Date();
    System.out.println(d.getTime());//这里就得到了唯一的编号。
      

  2.   

    办法有,有点小麻烦。 首先定义一个工厂类,生成你的订单号序列。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调用。首先定义一个jobpackage 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">
    <property name="targetObject" ref="job" />
    <property name="targetMethod" value="execute" />
    </bean><bean id="cronTrigger" class="org.springframework.scheduling.quartz.CronTriggerBean">
    <property name="jobDetail" ref="jobDetail" />
    <property name="cronExpression" value="0 0 0 * * ?" />
    </bean><bean name="quartzScheduler"
    class="org.springframework.scheduling.quartz.SchedulerFactoryBean">
    <property name="triggers">
    <list>
    <ref bean="cronTrigger" />
    </list>
    </property>
    </bean>
      

  3.   

    你要用到序列号的话,注入一个就行了。 这个不是单例,每次都会生成一个新的订单号。PS:此程序不适合服务器集群,如果是服务器集群的话,应该去查看数据库服务器的时间。而不是简单地 new Date();
      

  4.   

    并发量大的话,简单的算法肯定会出现重复的订单号,俺收藏了一个类用于产生32位的绝对全球唯一的编号,类似于hibernate中uuid生成方式package com.anxin.utils;import java.io.Serializable;
    import java.net.InetAddress;/**
     * 生成类似hibernate中uuid 32位主键序列
     * 
     * @version: V1.0
     */
    public class UUIDGenerator { private static final int IP; public static int IptoInt(byte[] bytes) {
    int result = 0;
    for (int i = 0; i < 4; i++) {
    result = (result << 8) - Byte.MIN_VALUE + (int) bytes[i];
    }
    return result;
    } static {
    int ipadd;
    try {
    ipadd = IptoInt(InetAddress.getLocalHost().getAddress());
    } catch (Exception e) {
    ipadd = 0;
    }
    IP = ipadd;
    }
    private static short counter = (short) 0;
    private static final int JVM = (int) (System.currentTimeMillis() >>> 8); public UUIDGenerator() {
    }
    public static int getJVM() {
    return JVM;
    }
    public static short getCount() {
    synchronized (UUIDGenerator.class) {
    if (counter < 0)
    counter = 0;
    return counter++;
    }
    }
    public static int getIP() {
    return IP;
    }
    public static short getHiTime() {
    return (short) (System.currentTimeMillis() >>> 32);
    } public static int getLoTime() {
    return (int) System.currentTimeMillis();
    } private final static String sep = ""; public static String format(int intval) {
    String formatted = Integer.toHexString(intval);
    StringBuffer buf = new StringBuffer("00000000");
    buf.replace(8 - formatted.length(), 8, formatted);
    return buf.toString();
    } public  static String format(short shortval) {
    String formatted = Integer.toHexString(shortval);
    StringBuffer buf = new StringBuffer("0000");
    buf.replace(4 - formatted.length(), 4, formatted);
    return buf.toString();
    } public static String generate() {
    return String.valueOf(new StringBuffer(36).append(format(getIP())).append(sep)
    .append(format(getJVM())).append(sep)
    .append(format(getHiTime())).append(sep)
    .append(format(getLoTime())).append(sep)
    .append(format(getCount())).toString());
    }
    public static void main(String args[]){
    System.out.println(UUIDGenerator.generate());
    }
    }
      

  5.   

    大约看了一下楼上的,挺精彩的。 不过楼上的可知, JDK提供了UUID算法的。UUID.randomUUID().toString().replaceAll("-", "");
      

  6.   

    只用时间不够,一毫秒可能生成若干个序列号。
    前面加用户ID应该可以了。
    一个操作ID在一个毫秒里肯定只有一个序列号。
    如果一个操作要生成若干个序列号,那后面再加个自增变量就可以了。userID+time+(i++)
      

  7.   

    UUID是比较常用的,简单点的做法的话,就用数据库的序列来做流水号,前面再加上日期
      

  8.   


    每次插入数据前 先max(id) 查询当前数据库数据最大的主键值
    然后截取前面10位 判断是否是当天
    如果是 则将后面的 00000003转化为数字 并+1 然后根据位数 补0
    如果不是今天 那么 直接跟00000001这样做最大的瓶颈是 假如你数据插入的比较频繁或者批量导入 这样就会造成重码
      

  9.   

    重码问题,方面声明为 synchronized 的,并用一个全局变量 记录当前编号, 方法里面 ++ 可以解决
      

  10.   

    有问题进 http://url.cn/1xXbuh   或者 http://url.cn/1IQli5   祝你好运!嘻嘻