`
lizhou
  • 浏览: 108196 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

java 自定义序列号 自动增长序列号

阅读更多

产生自定义格式的自动增长序列号:

/**
 * 自己维护的序列号,至少从1开始增长
 */
public abstract class IncrementNumber {
	
	public IncrementNumber() {}
	
	public IncrementNumber(int interval, int maxNum) {
		this.interval = interval;
		this.maxNum = maxNum;
	}
	
	public synchronized int cal() throws Exception {
		if (serialNum == -1) {
			serialNum = initStartNum(); // 已经使用的序列号一定 小于 缓存的序列号
			intervalMax = serialNum + interval;
			updateStartNum(intervalMax);
			return serialNum;
		}
		if (isMax(serialNum)) { // 达到预定的最大值
			resetSerialNum();
			return serialNum;
		}
		serialNum++;
		if (serialNum >= (intervalMax - 1)) { // 到达区间最大值
			intervalMax += interval;
			updateStartNum(intervalMax);
		}
		return serialNum;
	}
	
	/**
	 * 初始化序列号,从缓存系统中来,比如数据库、文件等
	 * @return 初始序列号
	 * @throws Exception
	 */
	public abstract int initStartNum() throws Exception;
	
	/**
	 * 更新区间最大值到缓存系统,比如数据库、文件中。
	 * @param intervalMax 区间最大值
	 * @throws Exception
	 */
	public abstract void updateStartNum(int intervalMax) throws Exception;
	
	/**
	 * 重置序列号,从1开始
	 */
	protected void resetSerialNum() throws Exception {
		this.serialNum = 1;
		intervalMax = serialNum + interval;
		updateStartNum(intervalMax);
	}
	
	/**
	 * 是否是最大值
	 * @param num
	 * @return
	 */
	private boolean isMax(int num) {
		return num >= maxNum;
	}
	
	public int getInterval() {
		return this.interval;
	}
	
	public int getMaxNum() {
		return this.maxNum;
	}
	
	/** 区间最大值 */
	protected int intervalMax = 0;
	
	/** 每次增加量 */
	protected int interval = 20;
	
	/** 预定的最大值 */
	protected int maxNum = 9999;
	
	/** 序列号 */
	protected int serialNum = -1;
}

 

使用方法:

@Service
@Transactional
public class TableKeyManager extends IncrementNumber {
	
	public TableKeyManager() {
		super(100, 99999999);
	}

	@Override
	public int initStartNum() throws Exception {
		TableKey tableKey = tableKeyDao.getById(name);
		date = DateConvertUtils.getDayEnd(DateConvertUtils.parse(tableKey.getDate(), "yyMMdd"));
		dateEndMillis = date.getTime();
		prefix = tableKey.getDate();
		return (int) tableKey.getMaxNum();
	}

	@Override
	public void updateStartNum(int intervalMax) throws Exception {
		TableKey tableKey = tableKeyDao.getById(name);
		tableKey.setDate(DateConvertUtils.format(new Date(dateEndMillis), "yyMMdd"));
		tableKey.setMaxNum(intervalMax);
		tableKeyDao.update(tableKey);
	}
	
	public String getNum() {
		try {
			long now = System.currentTimeMillis();
			int no = 0;
			if (now > dateEndMillis) {
				date = DateConvertUtils.getDayEnd(new Date(now));
				dateEndMillis = date.getTime();
				prefix = DateConvertUtils.format(date, "yyMMdd");
				resetSerialNum();
				no = this.serialNum;
			} else {
				no = cal();
			}
			return prefix + ApplicationUtil.getFixedSizeNum(no, 8);
		} catch (Exception e) {
			e.printStackTrace();
		}
		throw new RuntimeException("生成序列号错误");
	}
	
	public void setName(String name) {
		this.name = name;
	}
	
	private String prefix = null;
	
	private long dateEndMillis = 0l;
	
	private Date date = null;
	
	private String name;
	
	@Autowired
	private TableKeyDao tableKeyDao;
}

 

这种方法仅在初始化时查询一次数据库,在每次到达增长上限时,计数自动叠加一个步长,同时更新数据库中的数据上限。

 

table_key的数据结构

CREATE TABLE `table_key` (
  `key_name` varchar(100) NOT NULL COMMENT '需要维护的key名称',
  `cur_no` mediumtext COMMENT '当前数据编号',
  `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '数据编号更新时间',
  `create_time` datetime DEFAULT NULL COMMENT '记录创建时间',
  PRIMARY KEY (`key_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

 

 

 

 

分享到:
评论

相关推荐

    java 为php写的自增序号服务

    NULL 博文链接:https://wengmj.iteye.com/blog/401166

    RMPP 自定义序列号定位打印软件 v4.0

    RMPP 自定义序列号定位打印软件支持多个打印模板项目,各项目可以定义多个打印项,包括自定义序列号与文本内容,可自定义打印数量,打印位置,打印内容格式,设置简洁明了。    RMPP自定义序列号定位打印功能:  ...

    Java实现的license生成器

    用Java实现license的生成器,包括Java源码以及图形化界面

    按流水号生成编码

    按流水号生成编码(脚本)

    netty自定义协议

    netty实现自定义协议通信,形如: /** * socketHeader定义 40 + 4+ 100 +4 * 序列号 40bytes 不足前面补0 * 来源 4bytes * 指令 8bytes 不足前面补0 形如0001, 0000:心跳 * 长度 4bytes */ 心跳连接 运行 ...

    myeclipse 8.6注册机

    使用方法:在cmd环境下编译MyEclipseGen.java文件,运行MyEclipseGen.class即可,然后输入自己的定义的用户名,按确认键得到序列号。然后在myeclipse界面中,在导航栏上选择MyEclipse->subscription information....

    ModifyMobileIMEI:修改MTK平台手机序列号

    MTK平台手机串号(IMEI)修改APP ####机型修改: 其实跟安卓系统有关的一些信息大多在/system/build.prop这个文件中,尤其是跟机型有关的信息。下面是ZTE U960S3这台手机调试输出的信息: 可以看到型号(model),商标...

    MySQL高并发下生成唯一订单号的存储过程

    这个是用mysql写的存储过程,搭配里面一张数据表使用,达到高并发情况下获得唯一订单号的目的;原理:按照一定规则生成订单号后,把订单号插入数据表后,再返回给用户,由于数据表设置了主键,也就是当数据表中存在...

    ediplus注册码

    EditPlus 是一款功能强大的文字处理软件。...程序内嵌网页浏览器,其它功能还包含 FTP 功能、HTML 编辑、URL 突显、自动完成、剪贴文本、行列选择、强大的搜索与替换、多重撤销/重做、拼写检查、自定义快捷键,等等...

    MyEclipse8.5 注册机

    用于计算MyEclipse8.5的序列号,支持自定义用户名。 使用方式,解压后打开CMD运行java MyEclipseKeyGen命令,输入用户名回车,就可以计算出序列号。

    xmljava系统源码-spring-boot-demo:springbootdemo是一个用来深度学习并实战springboot的项目,该项

    java系统源码 spring-boot-demo spring boot demo 是一个用来深度学习并实战 spring boot 的项目,目前总共包含 16 个集成demo,已经完成 16 个。 该项目已成功集成batis-aop(AOP自定义多数据源)、multi-datasource-...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--系统信息之获得手机sim卡序列号 |--缓存优化之几种方案lastModified |--缓存优化之本地缓存优化(超过规定值或SD卡容量不够时) |--网络post提交查询请求 |--网络之HttpClient的get和post用法 |--网络之判断网络...

    SpringBoot智能停车微信小程序源码带数据库+文档

    ①本停车场系统兼容市面上主流的多家相机,理论上兼容所有硬件,可灵活扩展,②相机识别后数据自动上传到云端并记录,校验相机唯一id和硬件序列号,防止非法数据录入,③用户手机查询停车记录详情可自主缴费(支持...

    InstallAnywhere v5.5.1--专业、强大的安装工具

    ·用户可使用Java和基于JavaBeans的开放API,扩展设计自定义的动作、面板和控制台 ·在 XML或文本格式中安装日志 ·性能优化,提升安装时间两倍之多 ·XML的支持功能---包括了重新设计项目的文件格式,通过...

    PDF 编辑创建工具 PDF XChange Editor Plus 8.0.334.0 + x64 中文.zip

    PDF-XChange Editor是...安装说明:已集成补丁,安装时选择自定义模式,选择你想安装的功能,选择 Free Version (免费模式)安装即可,免注册。 https://www.tracker-software.com/product/pdf-xchange-editor/history

    安卓开发与分析者的利器--安卓右键工具1.2

    自动获取手机类型、系统版本、系统API版本、系统CPU类型、序列号、IMEI、分辨率等信息,任务完成后将自动显示获取到的手机信息,使用该功能时请先连接手机设备。执行结果将在右下角冒泡提示。 13、手机截图 对...

    KWIC_2A

    自动:Ing。 何塞·米萨尔·伯鲁尔·扎苏埃塔 KWIC v2.1参数自定义建模模型v1.0 KWIC v1.0的任何形式的修改 增强型SRC安全性和完整性KWIC v2.1 Estos Directorios se nombran segun su proposito en el Sistema:...

    新版Android开发教程.rar

    � Google 提供了一套 Java 核心包 (J2SE 5,J2SE 6) 的有限子集,尚不承诺遵守 Java 任何 Java 规范 , 可能会造 成J ava 阵营的进一步分裂。 � 现有应用完善度不太够,需要的开发工作量较大。--------------------...

    Eyrie-App:用于开源 Eyrie Thermostat 的 Android 应用程序

    Eyrie-App ...如果当前手机已有 API 密钥,请不要创建新的 API 密钥(密钥名称基于 Android 序列号) ... #####在 GPL v3 许可下分发 使用代码和图标,大量修改以处理两个以上的点,并具有温度变化。

    oracle学习文档 笔记 全面 深刻 详细 通俗易懂 doc word格式 清晰 连接字符串

    3. 运行该批处理程序将自动完成oracle卸载工作,最后手动删除\app文件夹(可能需要重启才能删除) 4. 运行regedit命令,打开注册表窗口。删除注册表中与Oracle相关的内容,具体如下:  删除HKEY_LOCAL_MACHINE/...

Global site tag (gtag.js) - Google Analytics