Java 程序生成阿里ADS数据库递增主键ID
背景介绍
在工作中切换数据库从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