求类似订单id的解决办法,做过项目的朋友过来看看
需求事这样的
1.订单id类似 2012041900001,2012041900002,2012041900003,2012041900004
2.不能重复
*3.在用户未下订单之前 订单编号要显示出来
大家有啥好的解决办法吗
------解决方案--------------------JScript code
var bCode = "";
var date = new Date();
bCode = date.getFullYear() + date.getMonth() + date.getDay() + date.getHours() + date.getMinutes() + date.getSeconds() + date.getMilliseconds();
document.getElementById("textField2").value = bCode;
------解决方案--------------------
------解决方案--------------------
订单编号可以在加载页面前,在后台生成,查询订单表中是否存在当天的订单(可以用日期模糊查询),存在:抓取最新(大)的编号+1
不存在生成一个当天日期+00001
把订单编号设最好为long
此方法简单 但不严谨
------解决方案--------------------
只要一天的订单 不上万条还是可以用的
------解决方案--------------------
------解决方案--------------------
日期+随机生成的5位数
Random random = new Random();
System.out.println(random.nextInt(89999) + 10000);
也不是很严谨
------解决方案--------------------
内存中缓存一个Map<String, String>的对象。里面存储每天的订单。key为日期,value为当前第几个
当天删除前一天的。先获取当前日期,例如:20120419,然后去map里面获取,如果没获取到则创建一个放到map里面。并用前一天的日期去获取,如果获取到了就remove。每次获取的时候+1就好了。其他就比较简单了。
其实很多种方式,这只是一种实现而已
------解决方案--------------------
如果楼主不追求连续性,只追求不冲突的话,可以每次取当天最大值+1.
考虑到减少数据库访问,提高性能的话,把当前最大值放到缓存中,加上同步锁。
考虑到系统重启的情况,每次系统启动时从数据库获取最大值并放到缓存。
关于连续性:如果要预先查看的话,订单编号是不能保证连续的,20120419 00009并不一定是当天的第9个订单,用户可能创建00005时放弃了,这样就会造成缺口。其实很多方式都会造成这样的缺口。
------解决方案--------------------
2012041900001 分为两部分,20120419 + 00001
日期20120419 + 自动编号 00001
注意,自动编号,要防止多线程并发访问安全的问题。
所以,获取自动编号的时候,需要加锁
给你的对象加锁。
synchronized(obj){
//代码
}
其他的没什么了。
------解决方案--------------------
没有那么复杂System.NanoTime()
再保险点就是存之前在查一遍
------解决方案--------------------
不用这么复杂 存时间 精确到秒就可以了
------解决方案--------------------
自定义前缀+日期+流水
需要2张表
一个是编号表
一个是使用表
编号表记录编码,也就是编号的格式
使用表记录编号是否使用 使用过的编号例如MM20120419001 即使订单删除了
第二次显示的时候会是MM20120419002,不会是MM20120419001
具体怎么做看楼主思路了,编号表肯定是有几个字段要注意
第一 前缀, 第二 日期, 第三 流水
------解决方案--------------------
订单号=意义标识+线程ID+当前时间(精确到秒)
------解决方案--------------------
前面一部分是日期,后面的递增部分可以用数据库的序列,每一个新日期,就把序列值初始化,再把两部分拼起来。