背景介绍

在工作中切换数据库从mysql切换到阿里ads分析型数据库,其支持生成uuid,但主键递增如何用程序实现呢? 在mysql中建表时可指定 ==AUTO_INCREMENT== 自增id即可。 答:借助序列来实现,主要代码如下所示。

Service 层
// 定义 单向链表实现的阻塞队列,先进先出的顺序
private static LinkedBlockingQueue<Long> concurrentLinkedQueue = new LinkedBlockingQueue<>(8192);
private static final int SEQ_COUNT = 256;
// 获取自增Id
@SneakyThrows
private Long getSequenceId() {
	if (concurrentLinkedQueue.isEmpty()) {
		@SuppressWarnings("unchecked")
		List<Long> seqIdList = logDao.getSequenceId(SEQ_COUNT);
		concurrentLinkedQueue.addAll(seqIdList);
		logger.info("concurrentLinkedQueue" + concurrentLinkedQueue.size());
	}
	return concurrentLinkedQueue.poll(2, TimeUnit.SECONDS);
}

数据库设置递增序列

// 创建序列
create sequence user_log_id_seq;
// 查询
select user_log_id_seq.nextval;
Dao层

对应的 logDao,数据库查询

public List<Long> getSequenceId(int count) {
		// 定义查询序列SQL
		String sql = "select user_log_id_seq.nextval where count = ?";
		// 封装方法,调用执行SQL,返回list<Map<>>
		List<Map<String, Object>> listMap = CorDbo.findRecordsWithFieldName(CorDbc.getDefaultDbc(), sql,
				Collections.singletonList(count));
		// 定义list
		List<Long> longList = Lists.newArrayList();
		// 遍历
		listMap.forEach(o -> o.forEach((k, v) -> longList.add(Long.valueOf(v.toString()))));
		return longList;
	}

知识回顾 user_log_id_seq.nextval 用来获取序列号的下一个squence的值 java.util.Collections.singletonList 返回不可变列表,减少内存空间。

参考文档

【1】https://help.aliyun.com/document_detail/93776.html