u010653640
2017-09-18 00:11
采纳率: 16.7%
浏览 5.2k

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

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

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

12条回答 默认 最新

  • cloudyzhao 2017-09-18 00:24

    201709180000000101
    日期+userid+顺序号

    点赞 打赏 评论
  • JettyXie 2017-09-18 00:29

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

    点赞 打赏 评论
  • 艾斯℃ 2017-09-18 00:34

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

    点赞 打赏 评论
  • DWT_CCFK 2017-09-18 00:40

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

    点赞 打赏 评论
  • IAmObject 2017-09-18 00:46

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

    点赞 打赏 评论
  • chibimarukochan 2017-09-18 01:03

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

    点赞 打赏 评论
  • 独家de记忆 2017-09-18 02:03

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

    点赞 打赏 评论
  • orangeTop 2017-09-18 02:35

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

    点赞 打赏 评论
  • 软件包 java.util.concurrent.atomic下提供了相关的类,可以用来生成顺序号

    点赞 打赏 评论
  • 杨、怼怼 2017-09-18 09:35

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

      /**
         * 获取固定长度自增值  每次获取 自动加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();
        }
    
    点赞 打赏 评论
  • ZealotTL 2017-09-18 14:28

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

    点赞 打赏 评论
  • yhan219 2017-09-19 03:59

    Twitter 的 Snowflake idworker

    点赞 打赏 评论

相关推荐