MyBatis-Plus 內(nèi)置雪花算法主鍵重復(fù)問(wèn)題
閱讀本文大概需要 2.8 分鐘。
來(lái)自:blog.csdn.net/wagnteng/article/details/117064242
問(wèn)題分析
-
服務(wù)器時(shí)間 -
workId(機(jī)器 ID 部分) -
datacenterId(數(shù)據(jù)標(biāo)識(shí) ID 部分)。
public Sequence() {
this.datacenterId = getDatacenterId(maxDatacenterId);
this.workerId = getMaxWorkerId(datacenterId, maxWorkerId);
}
//獲取workerId
protected static long getMaxWorkerId(long datacenterId, long maxWorkerId) {
StringBuilder mpid = new StringBuilder();
mpid.append(datacenterId);
//代表正在運(yùn)行的Java虛擬機(jī)的名稱。
String name = ManagementFactory.getRuntimeMXBean().getName();
if (StringUtils.isNotEmpty(name)) {
/*
* GET jvmPid
*/
mpid.append(name.split(StringPool.AT)[0]);
}
/*
* MAC + PID 的 hashcode 獲取16個(gè)低位
*/
return (mpid.toString().hashCode() & 0xffff) % (maxWorkerId + 1);
}
問(wèn)題解決
# 設(shè)置隨機(jī)
mybatis-plus.global-config.worker-id: ${random.int}
# 設(shè)置隨機(jī)
mybatis-plus.global-config.worker-id: ${random.int(1,31)}
com.baomidou.mybatisplus.core.toolkit.IdWorker這個(gè)核心類,獲取id的核心方法是com.baomidou.mybatisplus.core.toolkit.IdWorker#getId,那我們就在這里加一個(gè)斷點(diǎn)看下
public class IdWorker {
/**
* 主機(jī)和進(jìn)程的機(jī)器碼
*/
private static Sequence WORKER = new Sequence();
//獲取id
public static long getId() {
return WORKER.nextId();
}
public static String getIdStr() {
return String.valueOf(WORKER.nextId());
}
/**
* <p>
* 有參構(gòu)造器
* </p>
*
* @param workerId 工作機(jī)器 ID
* @param datacenterId 序列號(hào)
*/
public static void initSequence(long workerId, long datacenterId) {
WORKER = new Sequence(workerId, datacenterId);
}
/**
* <p>
* 使用ThreadLocalRandom獲取UUID獲取更優(yōu)的效果 去掉"-"
* </p>
*/
public static String get32UUID() {
ThreadLocalRandom random = ThreadLocalRandom.current();
return new UUID(random.nextLong(), random.nextLong()).toString().replace(StringPool.DASH, StringPool.EMPTY);
}
}
com.baomidou.mybatisplus.core.MybatisConfiguration#init方法來(lái)初始化配置信息,我們看下代碼
public void init(GlobalConfig globalConfig) {
// 初始化 Sequence
//這里需要同時(shí)設(shè)置workerId和datacenterId
if (null != globalConfig.getWorkerId()
&& null != globalConfig.getDatacenterId()) {
IdWorker.initSequence(globalConfig.getWorkerId(), globalConfig.getDatacenterId());
}
// 打印 Banner
if (globalConfig.isBanner()) {
System.out.println(" _ _ |_ _ _|_. ___ _ | _ ");
System.out.println("| | |\\/|_)(_| | |_\\ |_)||_|_\\ ");
System.out.println(" / | ");
System.out.println(" "+MybatisPlusVersion.getVersion()+" ");
}
}
# 設(shè)置隨機(jī)
mybatis-plus.global-config.worker-id: ${random.int(1,31)}
mybatis-plus.global-config.datacenter-id: ${random.int(1,31)}
推薦閱讀:
SpringBoot 運(yùn)行內(nèi)存及內(nèi)存參數(shù)設(shè)置:助力高效應(yīng)用部署與優(yōu)化
互聯(lián)網(wǎng)初中高級(jí)大廠面試題(9個(gè)G) 內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬(wàn)并發(fā)、消息隊(duì)列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper......等技術(shù)棧!
?戳閱讀原文領(lǐng)取! 朕已閱

