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

流水号唯一性的问题!
Calendar CD = Calendar.getInstance();
int MI = CD.get(Calendar.MILLISECOND);
String ddate=new SimpleDateFormat("yyyyMMddHHmmss").format(Calendar.getInstance().getTime()); 
ddate+=MI;//获取系统时间
我现在是用上面的方法得到毫秒来当订单的流水号,
请问大家有没有什么好点的方法使得到的流水号肯定不会重复?
前提是不经过数据库。
谢谢大家!

------解决方案--------------------
Java code
  private static long sequenceId = System.currentTimeMillis();

  public static long getNextId() {
    return sequenceId++;
  }

------解决方案--------------------
在配置文件里写个最大单据号,用的时候读出来直接加1.
------解决方案--------------------
自己写个算法,时间+IP..
------解决方案--------------------
不赞成主键和业务挂钩
但是楼主这种情况,
可以使用时间+业务键的方式
业务键可以是操作员id
同一毫秒,一个操作员应该不可能操作2个业务
------解决方案--------------------
足够长的位 offset from the Epoch in milliseconds 本身就是不重复的了
再加上一些无关紧要的业务信息
------解决方案--------------------
IP+时间+序列号(从一到xx的递增数字号)

个人建议.
------解决方案--------------------
用时间做ID号,就肯定不会重复了,要不再加上一些自己的数字,支持楼上的各位.
------解决方案--------------------
好的解决方案 大家都基本上已经讲解过了。我只有学习了
------解决方案--------------------
RandomStringUtils.randomAlphanumeric(21) + DateFun.DateByFormat(new Date(), "yyyyMMddHHmmsssss");

21位的随机字母加上毫秒级时间,我就不信会重
------解决方案--------------------
我觉得用这条记录的id+系统的当前时间就可以吧 应该很难碰到重复的 呵呵 我一直这么用
------解决方案--------------------
更精确点的话用纳秒吧 System.nanoTime();
------解决方案--------------------
个人理解
不建议上面的说法

对于流水号的问题只需要唯一标识就可以了

没有必要经过时间、IP等拼凑获得、更不建议使用数据库的自增

最好是使用随机数,思想类似于hibernate中UUID
java中同样有VMID可以获得唯一的随机数这个随机数在网络中重复的几率几乎为0

肯定可以满足你的需求