文档章节

Java生成流水号

七七仙人掌
 七七仙人掌
发布于 2012/02/20 16:07
字数 185
阅读 20641
收藏 30

上一个项目中,需要生成一个流水账号作为数据表主键,完成后,觉得还可以,不敢独享,遂贴出以供拍砖。

流水号格式为yyyyMMddXXXX,规定每天只能到9999,代码如下:

import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class PrimaryGenerater {

	private static final String SERIAL_NUMBER = "XXXX"; // 流水号格式
	private static PrimaryGenerater primaryGenerater = null;

	private PrimaryGenerater() {
	}

	/**
	 * 取得PrimaryGenerater的单例实现
	 * 
	 * @return
	 */
	public static PrimaryGenerater getInstance() {
		if (primaryGenerater == null) {
			synchronized (PrimaryGenerater.class) {
				if (primaryGenerater == null) {
					primaryGenerater = new PrimaryGenerater();
				}
			}
		}
		return primaryGenerater;
	}

	/**
	 * 生成下一个编号
	 */
	public synchronized String generaterNextNumber(String sno) {
		String id = null;
		Date date = new Date();
		SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
		if (sno == null) {
			id = formatter.format(date) + "0001";
		} else {
			int count = SERIAL_NUMBER.length();
			StringBuilder sb = new StringBuilder();
			for (int i = 0; i < count; i++) {
				sb.append("0");
			}
			DecimalFormat df = new DecimalFormat("0000");
			id = formatter.format(date)
					+ df.format(1 + Integer.parseInt(sno.substring(8, 12)));
		}
		return id;
	}
}

 

© 著作权归作者所有

七七仙人掌
粉丝 13
博文 4
码字总数 6282
作品 0
大连
程序员
私信 提问
加载中

评论(25)

简讯ing
简讯ing
http://www.51suishouji.com/archives/78 这里有方法
y
yy541451843
多服务器集群,就会出现重复
好好奋斗
这个程序有bug吧,敢问并发环境如何使用:
1、两个方法同时调用generaterNextNumber("201401080001")
2、岂不是返回的全部都是201401080002?
0x0001
0x0001

引用来自“七七仙人掌”的评论

引用来自“0x0001”的评论

引用来自“frankiegao123”的评论

竟然还用到了 DCL,可知 DCL 这样的用法在 Java 中是无效的,呵呵。

使用volatile关键字可以做DCL

volatile貌似不怎么稳定啊,不敢用

确实,要做延时初始化用内部静态类是最爽的
七七仙人掌
七七仙人掌 博主

引用来自“0x0001”的评论

引用来自“frankiegao123”的评论

竟然还用到了 DCL,可知 DCL 这样的用法在 Java 中是无效的,呵呵。

使用volatile关键字可以做DCL

volatile貌似不怎么稳定啊,不敢用
七七仙人掌
七七仙人掌 博主

引用来自“0x0001”的评论

public enum PrimaryGenerater {
  DEFAULT{
    private static final String SERIAL_NUMBER = "%04d";
    public synchronized String generaterNextNumber(String sno) {
      SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
      int prevNo = 1;
      if(null != sno && sno.length() == 12) {
        if(sno.matches("^\\d+$")) {
          prevNo = Integer.valueOf(sno.substring(8, 12)) + 1;
        } else {
          throw new IllegalArgumentException(String.format("非法参数:%s",sno));
        }
      }
      return String.format("%s"+SERIAL_NUMBER, formatter.format(new Date()),prevNo);
    }
  };

  /**
   * 生成下一个编号
   */
  public String generaterNextNumber(String sno) {
    throw new AbstractMethodError();
  }
  
  public static void main(String[] args) {
    String no = null;
    for(int i=0;i<100;i++) {
      no = PrimaryGenerater.DEFAULT.generaterNextNumber(no);
      System.out.println(no);
    }
  }
}

受教!
0x0001
0x0001

引用来自“frankiegao123”的评论

竟然还用到了 DCL,可知 DCL 这样的用法在 Java 中是无效的,呵呵。

使用volatile关键字可以做DCL
0x0001
0x0001
public enum PrimaryGenerater {
  DEFAULT{
    private static final String SERIAL_NUMBER = "%04d";
    public synchronized String generaterNextNumber(String sno) {
      SimpleDateFormat formatter = new SimpleDateFormat("yyyyMMdd");
      int prevNo = 1;
      if(null != sno && sno.length() == 12) {
        if(sno.matches("^\\d+$")) {
          prevNo = Integer.valueOf(sno.substring(8, 12)) + 1;
        } else {
          throw new IllegalArgumentException(String.format("非法参数:%s",sno));
        }
      }
      return String.format("%s"+SERIAL_NUMBER, formatter.format(new Date()),prevNo);
    }
  };

  /**
   * 生成下一个编号
   */
  public String generaterNextNumber(String sno) {
    throw new AbstractMethodError();
  }
  
  public static void main(String[] args) {
    String no = null;
    for(int i=0;i<100;i++) {
      no = PrimaryGenerater.DEFAULT.generaterNextNumber(no);
      System.out.println(no);
    }
  }
}
老庞
老庞

引用来自“七七仙人掌”的评论

引用来自“老庞”的评论

public static PrimaryGenerater getInstance() {
19
if (primaryGenerater == null) {
20
synchronized (PrimaryGenerater.class) {
21
if (primaryGenerater == null) {
22
primaryGenerater = new PrimaryGenerater();
23
}
24
}
25
}
26
return primaryGenerater;
27
}
为什么要判断两次 primaryGenerater == null 求指教~

减少同步带来的时间损耗

能讲详细点吗,这样做为什么能减少时间损耗?
七七仙人掌
七七仙人掌 博主

引用来自“老庞”的评论

public static PrimaryGenerater getInstance() {
19
if (primaryGenerater == null) {
20
synchronized (PrimaryGenerater.class) {
21
if (primaryGenerater == null) {
22
primaryGenerater = new PrimaryGenerater();
23
}
24
}
25
}
26
return primaryGenerater;
27
}
为什么要判断两次 primaryGenerater == null 求指教~

减少同步带来的时间损耗
Spring Boot 工程集成全局唯一ID生成器 Vesta

本文内容脑图如下: 文章共 760字,阅读大约需要 2分钟 ! --- 概 述 在前一篇文章 《Spring Boot工程集成全局唯一ID生成器 UidGenerator》 中给大家推荐了一款由百度开发的基于 Snowflake算...

CodeSheep
2018/11/22
1K
0
java采用UDP协议与设备通信有什么好用点的框架?

java采用UDP协议与设备通信有什么好用点的框架? 目前我是用的自己写的一个简单框架,对发送通道做池管理,侦听端口则配置多个端口提高并发量。 做的是工业级的项目,而udp又是老丢包,所以还...

GarenBean
2016/02/25
1K
5
javacore文件及heapdump文件分析

java程序运行时,有时会产生javacore及heapdump文件,为什么会产生这些文件呢?产生后应该如何分析呢?本文将回答上面的问题。 java程序在遇到致命问题时,就会产生这两个文件,有时产生时,...

吕猛
2010/12/13
4.8K
0
Jps介绍以及解决jps无法查看某个已经启动的java进程问题

对于jps较熟悉可以直接查看第二部分的分析 1、jps的作用 jps类似linux的ps命令,不同的是ps是用来显示进程,而jps只显示java进程,准确的说是当前用户已启动的部分java进程信息,信息包括进程...

疯狂的艺术家
2012/02/01
1K
5
JAVA中如何处理海量数据集?

正在参与一个计费系统的开发,系统需要定期的汇总用户的消费账单,周期不同或是按周汇总或是按月汇总,消费流水会比较庞大存储在DB2的若干张消费流水表中,现有的账单汇总程序是使用C编写的,...

简单的牛牛
2012/05/19
2K
1

没有更多内容

加载失败,请刷新页面

加载更多

MySQL左连接问题,右表做筛选,左表列依然在

两张表,一张user表,一张user_log表 CREATE TABLE `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(20) DEFAULT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFA......

bengozhong
5分钟前
1
0
重新开始学Java——多线程基础

多线程 进程 主流计算机操作系统都支持同时运行多个任务 , 每个任务通常就是一个程序 , 每个运行中的程序就是一个进程或者多个进程 。 进程的特点 独立性 进程是系统中独立存在的实体 可以...

大家都是低调来的
6分钟前
1
0
注解在Java中是如何工作的?

> 来一点咖啡,准备好进入注解的世界。 注解一直是 Java 的一个非常重要的部分,它从 J2SE 5.0 开始就已经存在了。在我们的应用程序代码中,经常看到 @Override 和 @Deprecated 这样的注解。...

liululee
8分钟前
3
0
Docker 容器连接

Docker 容器连接 容器间的链接有两种方法,你选择其一即可 网络端口映射 docker run -d -P docker run -d -p-P :是容器内部端口随机映射到主机的高端口。-p : 是容器内部端口绑定到指定...

测者陈磊
11分钟前
2
0
车载导航应用中基于Sketch UI主题定制方案的实现

1.导读 关于应用的主题定制,相信大家或多或少都有接触,基本上,实现思路可以分为两类: 内置主题(应用内自定义style) 外部加载方式(资源apk形式、压缩资源、插件等) 其实,针对不同的主题...

阿里云官方博客
17分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部