生成订单号,最大的问题是要考虑高并发的时候.在网上找的一些方案往往在这种情况下难以适用,比如,查询订单序列最大数,根据系统时间生成等.
再考虑另一种可行的方案:数据库递增序列,没错,确实能解决高并发的问题,但在集群等情况下对数据库压力比较大,而且有些数据库对递增序列没有很好的支持,同时递增序列的位数是一直增加的,也有可能会超出数据库表字段限制.
最好的方案是用java的uuid工具类生成唯一的字符串,然后再取这个字符串对象的hashcode值,因为字符串的值是唯一的,它的hashcode也是唯一的.
可参考如下代码:
/** 生成订单号,订单号的组成: 两位年+两位月+两位日+uuid哈希号(由于hashcode返回类型是int,最大为2147483648,不超过十位,所以此订单号不超过16位) * @return * @throws Exception **/ public String buildOrderSn() throws Exception { Date createDate = new Date(); SimpleDateFormat dateFormat = new SimpleDateFormat("yyMMdd"); StringBuilder out = new StringBuilder(dateFormat.format(createDate)); dateFormat = new SimpleDateFormat("yyyy-MM-dd"); int uuidNum = UUID.randomUUID().toString().hashCode(); out.append(uuidNum); return out.toString(); }
原文地址:http://blog.csdn.net/gufachongyang02/article/details/38374025