java提交订单时如何生成18位流水号

求一个思路,不用uuid。还有其他方法吗,生成订单的不重复的流水号

insert into t_trading(trading_code) values(CONCAT('DD',DATE_FORMAT(now(),'%Y%m%d'),LPAD(LAST_INSERT_ID()+1,20,'0')))

唯一不会重复的就是时间,那么我觉得我们就要把算法中增加当前时间

201709180000000101
日期+userid+顺序号

可以参考数据库的UUID的取法,如果有并发时间一样会重复

数据库建一个SEQ,每次去得到这个序列号,然后用bigdecimal转成18位

订单号常见的几种方式:
1.利用数据库主键值产生一个自增长的订单号(订单号即数据表的主键)
2.日期+自增长数字的订单号(比如:2012040110235662)
3.产生随机的订单号(65865325365966)
4.字母+数字字符串式,字母有包含特别意义,C02356652

一般流水号,都是有一定要求的,如可代表时间,可描述先后顺序,因此最佳解决方案是:时间+序列;
这里时间好解决,就是simpledateformat 的使用。问题就在序列这块,需要使用到数据库,或者说是写硬盘,其中写硬盘效率低且难维护。因此建议还是数据库序列吧。

登录的主机ip地址+当前时间+每天的顺序号

软件包 java.util.concurrent.atomic下提供了相关的类,可以用来生成顺序号

参考如下代码的 编程思路 自己改改 就出来了,要开启事务,避免生成重复值

  /**
     * 获取固定长度自增值  每次获取 自动加1
     * @param var   一维key
     * @param var2  二维key 默认0
     * @param length 自增值长度
     * @return
     */
    public static int getIncrementValue(String var, String var2, int length) {
        var2 = var2 == null ? "0" : var2;
        TransactionDao db = new TransactionDao(DbCode.ROOGO);
        Integer val = null;
        try {
            db.update(" UPDATE `tab_sysconfig` SET `value` = (value + 1)  WHERE var = ? and var2 = ? ", var, var2);
            String v = db.getUnique("SELECT `value` FROM tab_sysconfig WHERE var = ? and var2 = ? ", var, var2);
            if (v != null && v.length() == length)
                val = Integer.valueOf(v);
        } finally {
            try {
                db.commit();
            } finally {
                db.close();
            }
        }
        if (val == null) {
            val = new Double(Math.pow(10, length - 1)).intValue() + 1;
            setValue(var, var2, String.valueOf(val));
        }
        return val.intValue();
    }

时间yyyymmddhhmmss14位+4位随机数字
如果想碰撞更小减少时间位数,增加随机数位

Twitter 的 Snowflake idworker