支付不重复订单号生成
最近的项目中支付的订单号是使用附加项目中的工具做的,是一种带数据库自增形式的订单号,开始测试的时候没有任何问题,但是再高并发的实际应用中还是有不小的问题,只怪自己考虑太少,必须在高并发模式下保证订单号的唯一,我也参考了很多的案例,网上有个网友的回复很是精辟:
如果没有并发,订单号只在一个线程内产生,那么由于程序是顺序执行的,不同订单的生成时间一定不同,因此用时间就可以区分各个订单。 如果存在并发,且订单号是由一个进程中的多个线程产生的,那么只要把线程ID添加到序列号中就可以保证订单号唯一。 如果存在并发,且订单号是由同一台主机中的多个进程产生的,那么只要把进程ID添加到序列号中就可以保证订单号唯一。 如果存在并发,且订单号是由不同台主机产生的,那么MAC地址、IP地址或CPU序列号等能够区分主机的号码添加到序列号中就可以保证订单号唯一。
地址:
还有种方法是再订单号中加入时间,用户id(或唯一标识),随机数:其实这种方法对于那种业务并发低一些的项目中,这不失为一种好并发,像我最近做的停车项目中用户就不会再同一时间内停多辆车,这不失为一种办法
我做的是
/** * 获得唯一订单号 */ public static String getUniqueOrder() { SimpleDateFormat format = new SimpleDateFormat("YYYYMMddHHmmss"); String format2 = format.format(new Date()); int hashCodeV = UUID.randomUUID().toString().hashCode(); if(hashCodeV < 0) { //有可能是负数 hashCodeV = - hashCodeV; } return "pk"+format2+String.format("%012d", hashCodeV); }
以后做到多做笔记,记录下项目中遇到的点点滴滴