`
lizhou
  • 浏览: 109886 次
  • 性别: 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写的自增序号服务

    标题“java 为php写的自增序号服务”揭示了一个用Java编写的系统,它的主要功能是为PHP应用程序提供一个自动递增的序列号服务。这样的服务在数据库操作、唯一标识生成或者订单编号等场景中非常常见。让我们深入探讨...

    java产生序列号源码

    5. **自定义逻辑**:除了上述方法,开发者也可能根据业务需求自定义序列号生成逻辑,例如递增计数器,结合当前时间戳,甚至加上特定的业务标识等。 6. **编码与解码**:如果序列号需要进行加密,`java.util.Base64`...

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

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

    C#自动生成序列号 源码

    四、自定义序列号格式 尽管`Guid`已经足够唯一,但它可能不符合某些特定格式的需求。在这种情况下,我们可以使用`DateTime`,`BitConverter`等类来组合生成序列号。例如,我们可以结合当前时间戳和随机数来创建一个...

    查看硬盘序列号的java程序

    卷标是操作系统分配给磁盘分区的标识符,不同于硬盘序列号,它可以由用户自定义。虽然这个工具与获取硬盘序列号的主题不直接相关,但它们都属于系统级别的操作,可能对系统管理员或开发者有所帮助。 总之,了解如何...

    Java实现的license生成器

    本文将深入探讨如何使用Java语言来实现一个自定义的License生成器,并结合图形化用户界面(GUI)来提升用户体验。以下是对该主题的详细阐述: 一、Java源码实现License生成器 1. 数据结构:首先,我们需要定义一个...

    myeclipse序列号生成

    标题"myeclipse序列号生成"暗示我们将探讨如何为MyEclipse创建自定义的序列号。通常,序列号生成涉及到加密算法,如哈希函数、RSA公钥私钥对等,这些算法用于生成一组唯一且难以预测的数字或字母组合。开发者可能会...

    SourceInsight 带序列号 解压即用 绝对可用!!

    它提供了高效的代码浏览、编辑和理解功能,适用于多种编程语言,包括C、C++、Java等。这款工具以其智能的代码高亮、自动完成、跳转到定义等功能,极大地提升了程序员的工作效率。** 在您提供的压缩包文件中,...

    java生成流水-格式202001270001

    在这个场景中,“java生成流水-格式202001270001”指的是一个Java程序,用于生成具有特定格式的流水号,如示例所示的“202001270001”,该格式包含了日期和连续的序列号。以下将详细解释这个过程涉及的关键技术点。 ...

    sourceinsight4086+序列号+注册方法

    这一版本在前代基础上进行了多项优化,包括增强的代码导航功能,支持更多编程语言,以及更完善的自定义设置。它支持C、C++、Java等多种编程语言,可以快速定位到函数定义、变量声明等,提升代码阅读效率。 安装...

    SourceInsight3.5序列号+汉化

    SourceInsight是一款广受程序员喜爱的源代码分析和编辑工具,尤其在C/C++、Java等编程语言中表现出色。其强大的代码浏览、语法高亮、智能提示等功能,极大地提高了开发效率。本文将详细介绍如何在SourceInsight3.5...

    MapXtreme 2008 SCP 安装序列号

    最后,为了充分利用MapXtreme 2008 SCP的功能,用户应学习其提供的开发工具和API,例如,可能包含Java、.NET或Web服务接口,这些允许用户自定义和扩展GIS应用程序。通过深入学习和实践,用户可以创建满足特定业务...

    软件注册序列号生成源码

    在编程实现中,开发者可能会选择使用Python、Java、C#等语言,根据所选语言的特性,选择合适的库或框架来辅助实现这些功能。例如,Python可以使用`hashlib`进行哈希编码,`cryptography`库进行加密,以及`string`...

    SourceInsight+序列号

    SourceInsight是一款广受程序员喜爱的源代码分析和编辑软件,尤其适用于C/C++、Java等编程语言。它以其强大的功能和友好的用户界面,在编程社区中获得了高度评价。下面将详细介绍SourceInsight的主要特点和使用方法...

    SourceInsight及序列号

    SourceInsight提供了实时的语法高亮,能够根据不同的编程语言自动识别并突出显示关键字、注释和字符串,使得代码看起来更加清晰。同时,它的代码编辑功能强大,支持多文档界面,可以同时打开并编辑多个文件,方便在...

    SourceInsight3(附序列号)

    8. **自定义设置**:SourceInsight允许用户根据个人喜好调整界面布局、字体大小以及颜色主题等,打造个性化的开发环境。 **序列号使用** "内附序列号,可直接使用"意味着提供者已经包含了SourceInsight 3的合法...

    Netty4编写服务器客户端,自定义编解码,发送自定义消息

    例如,你可以定义一个 `CustomMessage` 类,包含一个整型的序列号、一个字符串类型的消息内容以及其他可能需要的字段。确保为每个字段提供 getter 和 setter 方法以便于访问和设置。 接下来,我们需要编写自定义的...

    java中的序列号和反序列化.doc

    Java中的序列化和反序列化是...总之,Java的序列化和反序列化机制提供了一种方便的方式来持久化和传输对象,同时也允许开发者自定义序列化行为以满足特定需求。正确理解和应用这些机制对于Java开发者来说是至关重要的。

    Java软件保护机制的研究与实现.pdf

    针对这一问题,本文作者尹艳阳和任洪敏提出了一系列Java软件保护机制的研究与实现,主要围绕Java软件序列号方式实现授权、类文件加密、自定义加载类以及代码混淆等关键技术展开讨论。 首先,文章提到软件保护的重要...

Global site tag (gtag.js) - Google Analytics