產生自定義格式的自動增長序列號
阿新 • • 發佈:2018-05-26
更新時間 cal nod extends return trace primary png zed
產生自定義格式的自動增長序列號:
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;
- }
使用方法:
Java代碼- @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的數據結構
Sql代碼- 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
產生自定義格式的自動增長序列號