流水号唯一性的问题!

ty_119119 2008-03-17 03:30:30
Calendar CD = Calendar.getInstance();
int MI = CD.get(Calendar.MILLISECOND);
String ddate=new SimpleDateFormat("yyyyMMddHHmmss").format(Calendar.getInstance().getTime());
ddate+=MI;//获取系统时间
我现在是用上面的方法得到毫秒来当订单的流水号,
请问大家有没有什么好点的方法使得到的流水号肯定不会重复?
前提是不经过数据库。
谢谢大家!
...全文
396 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiafan 2008-07-06
  • 打赏
  • 举报
回复
我是在插入的时候才写流水号。
ty_119119 2008-05-01
  • 打赏
  • 举报
回复
是啊,给线程加个锁,应该没问题了吧。
  • 打赏
  • 举报
回复
更精确点的话用纳秒吧 System.nanoTime();
yanbin1016 2008-03-21
  • 打赏
  • 举报
回复
我觉得用这条记录的id+系统的当前时间就可以吧 应该很难碰到重复的 呵呵 我一直这么用
robin_ares 2008-03-21
  • 打赏
  • 举报
回复
RandomStringUtils.randomAlphanumeric(21) + DateFun.DateByFormat(new Date(), "yyyyMMddHHmmsssss");

21位的随机字母加上毫秒级时间,我就不信会重
wgzhong 2008-03-21
  • 打赏
  • 举报
回复
个人理解
不建议上面的说法

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

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

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

肯定可以满足你的需求
fy_kenny 2008-03-19
  • 打赏
  • 举报
回复
好的解决方案 大家都基本上已经讲解过了。我只有学习了
chjx1982 2008-03-18
  • 打赏
  • 举报
回复
用时间做ID号,就肯定不会重复了,要不再加上一些自己的数字,支持楼上的各位.
bobor_2008 2008-03-18
  • 打赏
  • 举报
回复
IP+时间+序列号(从一到xx的递增数字号)

个人建议.
lanzhengwu 2008-03-17
  • 打赏
  • 举报
回复
自己写个算法,时间+IP..
aoyihuashao 2008-03-17
  • 打赏
  • 举报
回复
在配置文件里写个最大单据号,用的时候读出来直接加1.
老紫竹 2008-03-17
  • 打赏
  • 举报
回复
  private static long sequenceId = System.currentTimeMillis();

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


如果你的机器时间不向过去调整,不会出现问题。
至于并发,我理解,因为++属于最底层的单步操作,等同于汇编里面的
inc dword ptr [2121212];

如果你不放心,可以加上
  private static long sequenceId = System.currentTimeMillis();

public static synchronized long getNextId() {
return sequenceId++;
}
dracularking 2008-03-17
  • 打赏
  • 举报
回复
足够长的位 offset from the Epoch in milliseconds 本身就是不重复的了
再加上一些无关紧要的业务信息
mengyuxiang 2008-03-17
  • 打赏
  • 举报
回复
不赞成主键和业务挂钩
但是楼主这种情况,
可以使用时间+业务键的方式
业务键可以是操作员id
同一毫秒,一个操作员应该不可能操作2个业务

81,090

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧