java 生成9位数流水号

shangezi 2016-03-17 09:40:10
想使用java生成9位数的流水号,从1开始,例如是 000000001,0000000002。。。。。
也要防止重复,使用的是mysql数据库,请大神能提供代码,感谢。
...全文
2552 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
Intboy 2016-11-03
  • 打赏
  • 举报
回复
引用 13 楼 xiaoy81 的回复:
[quote=引用 6 楼 fengspg 的回复:] [quote=引用 4 楼 MamyA 的回复:] [quote=引用 3 楼 fengspg 的回复:]
AtomicLong at = new AtomicLong();
        
        for (int i = 0; i < 10; i++)
        {
            Long atLong = at.incrementAndGet();
            System.out.println(String.format("%09d", atLong));
        }
这个方案会跳号吧?一旦触发不能回退,而且不易于控制生成细节。但是有点是效率较高(相对于其他手动控制方式而言),但是并发的话因为是用sync代码级别同步的控制的,高并发级别效果应该不太理想了。。 个人观点。 [/quote] 不知道你说的跳号是什么意思,decrement就可以回退啊,同时他使用本来就是原子操作,底层使用native接口实现原子增加,而并不是使用sync代码做同步控制,[/quote] 宕机的话就懵逼了你这种方案[/quote]
tata1618 2016-11-02
  • 打赏
  • 举报
回复
引用 6 楼 fengspg 的回复:
[quote=引用 4 楼 MamyA 的回复:] [quote=引用 3 楼 fengspg 的回复:]
AtomicLong at = new AtomicLong();
        
        for (int i = 0; i < 10; i++)
        {
            Long atLong = at.incrementAndGet();
            System.out.println(String.format("%09d", atLong));
        }
这个方案会跳号吧?一旦触发不能回退,而且不易于控制生成细节。但是有点是效率较高(相对于其他手动控制方式而言),但是并发的话因为是用sync代码级别同步的控制的,高并发级别效果应该不太理想了。。 个人观点。 [/quote] 不知道你说的跳号是什么意思,decrement就可以回退啊,同时他使用本来就是原子操作,底层使用native接口实现原子增加,而并不是使用sync代码做同步控制,[/quote] 宕机的话就懵逼了你这种方案
AKIIscer 2016-03-22
  • 打赏
  • 举报
回复
DROP TABLE IF EXISTS `aa`; CREATE TABLE `aa` ( `id` int(9) NOT NULL auto_increment, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; 数据取出后format一下格式就可以了 DecimalFormat df = new DecimalFormat("000000000"); System.out.println(df.format(1));
  • 打赏
  • 举报
回复
这个流水号其实就一个左填0 的问题 参考
qingtianrx 2016-03-21
  • 打赏
  • 举报
回复
写完这两个函数再写一个将数字转成补成9位String的java函数
qingtianrx 2016-03-21
  • 打赏
  • 举报
回复
看这样行不?mysql单独建立一个序列号字段,初始值0,写一个方法调用取出当前值,再写一个方法将其+1,取值完成后调用+1函数写入到mysql
Intboy 2016-03-18
  • 打赏
  • 举报
回复
AtomicLong at = new AtomicLong();
        
        for (int i = 0; i < 10; i++)
        {
            Long atLong = at.incrementAndGet();
            System.out.println(String.format("%09d", atLong));
        }
MamyA 2016-03-18
  • 打赏
  • 举报
回复
因为你要固化流水号,而且有自定义规则,方向上我倾向一楼,但是有缺陷,这样为了维护一个流水号给数据库带来太大开销,我个人建议,采用缓存+数据库方式来处理,就是流水号的生成永远是用缓存中保存的最大值来自定义规则生成,然后和其他数据提交一起保存到数据库中,这样既可以保证流水号不重复,也不会给数据库带来任何额外开销,同时可以控制流水号的一些生成策略,如是否连续等等。你只需要保证自己缓存中永远有一个流水号种子即可。
MamyA 2016-03-18
  • 打赏
  • 举报
回复
引用 6 楼 fengspg 的回复:
[quote=引用 4 楼 MamyA 的回复:] [quote=引用 3 楼 fengspg 的回复:]
AtomicLong at = new AtomicLong();
        
        for (int i = 0; i < 10; i++)
        {
            Long atLong = at.incrementAndGet();
            System.out.println(String.format("%09d", atLong));
        }
这个方案会跳号吧?一旦触发不能回退,而且不易于控制生成细节。但是有点是效率较高(相对于其他手动控制方式而言),但是并发的话因为是用sync代码级别同步的控制的,高并发级别效果应该不太理想了。。 个人观点。 [/quote] 不知道你说的跳号是什么意思,decrement就可以回退啊,同时他使用本来就是原子操作,底层使用native接口实现原子增加,而并不是使用sync代码做同步控制,[/quote] 确实如此。我现在使用的是改写后的,分布式策略生成控制,所以用的是sync控制,封装的atomic包的结构,我刚刚直接当成原生API来解释的,对于atomic是native原子内存读取,没错的。
Ng_Simon 2016-03-18
  • 打赏
  • 举报
回复
引用 1 楼 songyanfei1205 的回复:
不要想着坐享其成,你说的这个很好做,1、建议创建一个流水号表,写个方法从该表获取最新的流水号,然后按照规则自动增长(规则由你定),生成之后在存进数据库,每次都不相等。2、直接在你的业务表里获取流水号,然后自动增长。代码自己写
方法可行,但是兄弟如果有并发的情况就有可能造成重复了,如果用同步的话可能会影响效率。没有高并发应该问题都不大。
Intboy 2016-03-18
  • 打赏
  • 举报
回复
引用 4 楼 MamyA 的回复:
[quote=引用 3 楼 fengspg 的回复:]
AtomicLong at = new AtomicLong();
        
        for (int i = 0; i < 10; i++)
        {
            Long atLong = at.incrementAndGet();
            System.out.println(String.format("%09d", atLong));
        }
这个方案会跳号吧?一旦触发不能回退,而且不易于控制生成细节。但是有点是效率较高(相对于其他手动控制方式而言),但是并发的话因为是用sync代码级别同步的控制的,高并发级别效果应该不太理想了。。 个人观点。 [/quote] 不知道你说的跳号是什么意思,decrement就可以回退啊,同时他使用本来就是原子操作,底层使用native接口实现原子增加,而并不是使用sync代码做同步控制,
智慧老师 2016-03-18
  • 打赏
  • 举报
回复
直接用序列行吗
MamyA 2016-03-18
  • 打赏
  • 举报
回复
引用 3 楼 fengspg 的回复:
AtomicLong at = new AtomicLong();
        
        for (int i = 0; i < 10; i++)
        {
            Long atLong = at.incrementAndGet();
            System.out.println(String.format("%09d", atLong));
        }
这个方案会跳号吧?一旦触发不能回退,而且不易于控制生成细节。但是有点是效率较高(相对于其他手动控制方式而言),但是并发的话因为是用sync代码级别同步的控制的,高并发级别效果应该不太理想了。。 个人观点。
残月飞鹰 2016-03-17
  • 打赏
  • 举报
回复
不要想着坐享其成,你说的这个很好做,1、建议创建一个流水号表,写个方法从该表获取最新的流水号,然后按照规则自动增长(规则由你定),生成之后在存进数据库,每次都不相等。2、直接在你的业务表里获取流水号,然后自动增长。代码自己写

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧