编号生成之Hilo高低位算法

高低位算法是Hibernate的一种主键生成策略,使用一个高位值和一个低位值,然后把算法得到的两个值拼接起来作为数据库中的唯一主键。

Hilo算法需要额外的数据库表的支持,但不需要每次生成都去查询数据库,查询数据库的频率取决于maxLo。
  
创建数据库表

CREATE TABLE `sn` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT,
  `lastValue` bigint(20) NOT NULL,
  `name` varchar(32) NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_name` (`name`) 
)

高低位算法Java代码

	/**
	 * 高低位算法生成器
	 */
	private class HiloOptimizer {

		/**
		 * 根据name查询对应lastValue
		 */
		private String name;

		/**
		 * 前缀,例如日期
		 */
		private String prefix;

		/**
		 * 最大低位值,决定查询数据库的频率
		 */
		private int maxLo;

		/**
		 * 低位值
		 */
		private int lo;

		/**
		 * 高位值
		 */
		private long hi;

		/**
		 * 末值
		 */
		private long lastValue;

		/**
		 * 构造方法
		 */
		HiloOptimizer(String name, String prefix, int maxLo) {
			this.name = name;
			this.prefix = prefix;
			this.maxLo = maxLo;
			//初始化时使 lo > maxLo 
			this.lo = maxLo + 1;
		}

		/**
		 * 生成编号
		 */
		public synchronized String generate() {
			if (lo > maxLo) {
				//调用查询方法获得末值,使其自增并更新到数据库中
				lastValue = getLastValue(name);
				//改变lo的值
				lo = 0;
				//高位值进位
				hi = lastValue * (maxLo + 1);
			}
			//拼接编号,lo+1
			return prefix + (hi + lo++);
		}
	}
	
	/**
	 * 获取末值
	 */
	private long getLastValue(String name) {
		String jpql = "select sn from Sn sn where sn.name like :name";
		Sn sn = entityManager.createQuery(jpql, Sn.class).setLockMode(LockModeType.PESSIMISTIC_WRITE).setParameter("name", name).getSingleResult();
		long lastValue = sn.getLastValue();
		sn.setLastValue(lastValue + 1);
		return lastValue;
	}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值