精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

警惕!MyBatis-Plus 主鍵生成策略的隱藏坑,踩過都哭了!

開發
如果你在 MyBatis-Plus 的 集群環境 中遇到了 主鍵重復 的問題,不要只是修修補補,而是 直接換用 Seata 的雪花算法,徹底解決 ID 生成沖突,避免線上事故!

在 MyBatis-Plus 的使用過程中,我們經常會享受到其便捷的 CRUD 操作,特別是內置的主鍵生成策略,省去了手動管理 ID 的繁瑣。然而,當項目進入生產環境,特別是在 集群部署 或 K8S 容器化部署 后,你可能會遇到一個令人頭疼的問題——主鍵重復。

這并不是一個小概率事件,而是許多開發者在 高并發分布式環境 下都會踩中的坑。一旦主鍵重復,數據庫插入操作將直接失敗,影響正常業務流程,甚至可能導致整個系統不可用。更糟糕的是,很多開發者在調試時可能并沒有意識到問題的根源,導致線上 Bug 難以復現,排查困難。

本篇文章將深入剖析 MyBatis-Plus 主鍵生成策略的機制,探討其在 Docker、K8S 及集群環境下為何會導致主鍵沖突,并提供一個更加穩定、高效的 分布式 ID 生成方案。如果你在 MyBatis-Plus 項目中使用了默認的主鍵策略,強烈建議閱讀本文,否則你很可能在未來的某一天,因主鍵重復問題而陷入崩潰的境地!

以下是一個典型的錯誤日志:

Mybatis-Plus 啟動時會通過 com.baomidou.mybatisplus.core.toolkit.Sequence 類的
getMaxWorkerId() 和 getDatacenterId() 方法來初始化 workerId 和 dataCenterId。

讓我們來看一下 MyBatis-Plus 生成 workerId 和 dataCenterId 的關鍵代碼:

  • Worker ID 生成邏輯
protected long getMaxWorkerId(long datacenterId, long maxWorkerId) {
    StringBuilder mpid = new StringBuilder();
    mpid.append(datacenterId);
    String name = ManagementFactory.getRuntimeMXBean().getName();
    if (StringUtils.isNotBlank(name)) {
        mpid.append(name.split("@")[0]);
    }
    return (long)(mpid.toString().hashCode() & '\uffff') % (maxWorkerId + 1L);
}
  • Data Center ID 生成邏輯
protected long getDatacenterId(long maxDatacenterId) {
    byte[] mac = network.getHardwareAddress();
    if (null != mac) {
        id = (255L & (long)mac[mac.length - 2] | 65280L & (long)mac[mac.length - 1] << 8) >> 6;
        id %= maxDatacenterId + 1L;
    }
    return id;
}

從代碼可以看出,workerId 由 JVM 進程名稱生成,dataCenterId 由 MAC 地址計算。然而,在 Docker 環境下,容器的 JVM 進程名稱可能重復,MAC 地址也可能被橋接網絡共享,這導致 ID 生成可能發生沖突,進而引發主鍵重復問題。

替代方案:更可靠的雪花算法

與其糾結于如何修復 MyBatis-Plus 的 ID 生成邏輯,不如直接采用 更優化的雪花算法,該算法不僅能解決 ID 沖突,還能 提升數據庫性能。

為什么需要優化 ID 生成策略?

在數據庫設計中,分布式 ID 需要滿足以下特性:

  • 全局唯一性:防止 ID 沖突
  • 遞增趨勢:減少 MySQL 數據頁分裂,提高性能
  • 高效生成:保證高并發環境下 ID 生成的速度

常見的分布式 ID 方案:

  • 百度 UidGenerator
  • 滴滴 TinyID
  • 美團 Leaf
  • Twitter 雪花算法(SnowFlake)

雖然這些方案都能滿足分布式 ID 需求,但大部分需要依賴 數據庫或 Redis,對于中小型項目而言,額外的組件依賴可能帶來運維成本。

因此,我們更推薦 Seata 改進版雪花算法,它不僅優化了 標準版雪花算法的“時鐘回撥”問題,而且實現更加簡潔。

標準版雪花算法的缺陷

傳統雪花算法的 ID 格式如下:

| 時間戳(41位) | 機器 ID(10位) | 序列號(12位) |

時間戳依賴系統時間,如果服務器時鐘回撥,可能會導致 ID 生成沖突。

同一毫秒內的序列號最多 4096(2^12)個,超出后需要等待下一個毫秒。

Seata 優化方案

Seata 對 雪花算法的 ID 結構進行了改造,使其不再依賴系統時間,而是使用 內存中的時間戳遞增,避免了時鐘回撥問題:

核心代碼

/**
 * timestamp 和 sequence 合并存儲在一個 Long 類型中
 * 最高 11 位:未使用
 * 中間 41 位:時間戳
 * 最低 12 位:序列號
 */
private AtomicLong timestampAndSequence;

/**
 * 序列號占用的位數
 */
private final int sequenceBits = 12;

/**
 * 初始化時間戳和序列號
 */
private void initTimestampAndSequence() {
    long timestamp = getNewestTimestamp();
    long timestampWithSequence = timestamp << sequenceBits;
    this.timestampAndSequence = new AtomicLong(timestampWithSequence);
}

代碼解析:

  • 時間戳和序列號合并存儲,通過 AtomicLong 保證線程安全。
  • 時間戳不會直接綁定操作系統,而是采用 內部遞增機制 避免時鐘回撥問題。

Worker ID 生成方式

Seata 還改進了 Worker ID 生成邏輯,避免 MyBatis-Plus 依賴 MAC 地址的問題:


/**
 * 初始化 WorkerId
 * @param workerId 如果為空,則自動生成
 */
private void initWorkerId(Long workerId) {
    if (workerId == null) {
        workerId = generateWorkerId();
    }
    if (workerId > maxWorkerId || workerId < 0) {
        throw new IllegalArgumentException("WorkerId 超出范圍:" + maxWorkerId);
    }
    this.workerId = workerId << (timestampBits + sequenceBits);
}

/**
 * 生成 Worker ID,優先使用 MAC 地址,否則隨機生成
 */
private long generateWorkerId() {
    try {
        return generateWorkerIdBaseOnMac();
    } catch (Exception e) {
        return generateRandomWorkerId();
    }
}

/**
 * 獲取 MAC 地址生成 Worker ID
 */
private long generateWorkerIdBaseOnMac() throws Exception {
    Enumeration<NetworkInterface> all = NetworkInterface.getNetworkInterfaces();
    while (all.hasMoreElements()) {
        NetworkInterface networkInterface = all.nextElement();
        if (networkInterface.isLoopback() || networkInterface.isVirtual()) {
            continue;
        }
        byte[] mac = networkInterface.getHardwareAddress();
        return ((mac[4] & 0B11) << 8) | (mac[5] & 0xFF);
    }
    throw new RuntimeException("沒有可用的 MAC 地址");
}

優化點:

  • Worker ID 優先使用 MAC 地址,無法獲取時則隨機生成,避免 Docker 容器 MAC 共享問題。
  • 時間戳與系統時間解耦,不再受 時鐘回撥影響。
  • 序列號遞增機制優化,保證 高并發環境下的唯一性。

總結

如果你在 MyBatis-Plus 的 集群環境 中遇到了 主鍵重復 的問題,不要只是修修補補,而是 直接換用 Seata 的雪花算法,徹底解決 ID 生成沖突,避免線上事故!

Seata 方案的優勢:

  • 無外部依賴,適合中小型項目
  • 避免時鐘回撥問題,提高 ID 生成穩定性
  • 高性能,支持高并發

如果你的項目仍然采用 MyBatis-Plus 默認的 ID 生成策略,建議盡快引入 Seata 雪花算法,讓你的系統更健壯!

責任編輯:趙寧寧 來源: 路條編程
相關推薦

2023-10-31 08:01:48

Mybatis參數jdbcurl?

2022-04-26 21:49:55

Spring事務數據庫

2019-10-30 14:44:41

Prometheus開源監控系統

2024-04-01 08:05:27

Go開發Java

2024-12-20 16:49:15

MyBatis開發代碼

2017-07-17 15:46:20

Oracle并行機制

2025-04-14 09:31:03

2025-06-03 06:30:05

2025-05-27 08:45:00

2018-01-10 13:40:03

數據庫MySQL表設計

2025-02-27 09:45:47

2025-04-03 12:30:00

C 語言隱式類型轉換代碼

2020-11-03 06:57:10

MyBatis數據庫

2024-05-06 00:00:00

緩存高并發數據

2015-03-24 16:29:55

默認線程池java

2019-09-18 15:20:16

MyBatisSQL數據庫

2023-06-07 08:00:00

MySQL批量插入

2025-10-15 02:45:00

系統分表接口

2025-04-29 10:17:42

2024-12-04 09:36:37

點贊
收藏

51CTO技術棧公眾號

欧美精品videos另类| 青青草视频网站| 国产在线高清| 91夜夜蜜桃臀一区二区三区| 亚洲综合色丁香婷婷六月图片| 亚洲精品免费一区二区三区| 欧美肥婆姓交大片| 国内av免费观看| www.超碰在线| 日韩三级电影网| 国产精品一区高清| 欧美日韩国产乱码电影| 国产爆乳无码一区二区麻豆| 人妻精品一区一区三区蜜桃91| 免费一区视频| 欧美日韩免费做爰视频| 天堂av中文在线资源库| 视频一区免费在线观看| 欧美一级视频免费在线观看| 少妇一级淫免费观看| 中文字幕av一区二区三区佐山爱| √…a在线天堂一区| 久久99精品久久久久子伦| 一本色道久久综合熟妇| 国产一区91| 国产人妻人伦精品1国产丝袜| 青草影视电视剧免费播放在线观看| www.在线欧美| 成人免费看片视频| 一二三区免费视频| 激情欧美国产欧美| 精品成人在线视频| 3d动漫啪啪精品一区二区免费 | 中文字幕亚洲欧美| 日韩av无码一区二区三区不卡| 国产情侣一区二区三区| 一区二区日韩| 欧美视频在线观看一区二区| 成人中文字幕在线播放| 在线xxxx| 亚洲三级在线播放| 亚洲欧美国产不卡| 国产黄在线播放| 99国产精品国产精品毛片| 不卡视频一区| 亚洲春色一区二区三区| 欧美丝袜足交| 天天综合一区| 亚洲精品永久免费精品| 2018国产精品| 国产精品500部| 99久久影视| 这里只有精品在线观看| 久久久久久亚洲中文字幕无码| 99re8这里有精品热视频8在线| 欧美丰满少妇xxxbbb| 国产视频手机在线播放| 亚洲精品国产嫩草在线观看| 色噜噜夜夜夜综合网| 国产av麻豆mag剧集| heyzo中文字幕在线| 亚洲影视资源网| av在线观看地址| www视频在线观看| 天天操天天综合网| 国产又黄又大又粗视频| 第84页国产精品| 一本久道久久综合中文字幕 | 1024国产在线| 国产精品久久久久久久久果冻传媒 | 日韩黄色大片| 日韩视频免费看| 欧美日韩免费做爰视频| 亚洲精选成人| 国产精品白嫩美女在线观看| 自拍偷拍色综合| 国产一区在线不卡| 国产精选一区二区| 国产三级在线免费观看| 成人免费一区二区三区视频| 成年在线观看视频| 蜜桃在线视频| 欧美日韩国产精选| 国产精品欧美性爱| 色综合综合色| 蜜臀久久99精品久久久无需会员| 国产一级aa大片毛片| 99精品视频免费观看视频| 日韩av手机在线看| 国产美女无遮挡永久免费| 成人深夜在线观看| 天天人人精品| 久草在线资源站资源站| 日本丰满少妇一区二区三区| www.se五月| 中文字幕av一区二区三区四区| 精品小视频在线| 欧美大片xxxx| 午夜在线视频观看日韩17c| 国产一区深夜福利| 五月婷婷在线播放| 亚洲视频中文字幕| 国产精品秘入口18禁麻豆免会员| 欧美天堂一区| 日韩精品高清视频| 免费看一级大片| 久久久久久自在自线| 91精品黄色| 高清国产福利在线观看| 亚洲最新视频在线观看| 国产精品自拍视频在线| 亚洲第一视频在线| 久久婷婷国产综合国色天香| 影音先锋成人资源网站| 欧美日韩视频网站| 亚洲大胆美女视频| 国产黄色录像片| 午夜一区不卡| 国产高清在线一区二区| 日本中文字幕伦在线观看| 天天操天天干天天综合网| 日本女人黄色片| 日韩免费一区| 国产精品九九九| 亚洲三级黄色片| 亚洲乱码日产精品bd| 免费国产成人看片在线| 欧美aa视频| 亚洲黄色av女优在线观看| 亚洲av鲁丝一区二区三区| 日本视频中文字幕一区二区三区| 国产一区二区三区四区hd| 成人免费看片| 欧美电影在线免费观看| 黄色片在线观看免费| 蜜桃视频一区| 蜜桃在线一区二区三区精品| 美女av在线免费看| 亚洲精品久久久久久久久| 久久精品www人人爽人人| 国产一区二区不卡| 国产香蕉一区二区三区| 香蕉久久一区| 久久精品99久久久久久久久| 亚洲图片欧美在线| 中文字幕免费在线观看视频一区| 女人另类性混交zo| 综合综合综合综合综合网| 2020久久国产精品| 深夜福利在线看| 精品久久久久久中文字幕大豆网 | wwwwww.欧美系列| 蜜桃传媒一区二区三区| 国产精品中文字幕制服诱惑| 久久久久久美女| 天天干天天舔天天射| 亚洲不卡在线观看| 182在线视频| 亚洲欧美日本视频在线观看| 日本福利一区二区三区| 亚洲第一会所| 日韩在线观看网站| 国产夫绿帽单男3p精品视频| 亚洲嫩草精品久久| 最新版天堂资源在线| 亚洲影视在线| 日韩欧美激情一区二区| 日韩黄色三级在线观看| 麻豆国产va免费精品高清在线| 亚洲av少妇一区二区在线观看| 亚洲第一激情av| 亚洲高清在线免费观看| 日韩免费看片| av在线不卡一区| 涩涩视频在线播放| 怡红院精品视频| 国产免费黄色大片| 亚洲福利视频一区二区| 人妻熟女aⅴ一区二区三区汇编| 日韩不卡一二三区| 黄色一级视频播放| 久久国产精品免费精品3p| 日本sm极度另类视频| 亚洲天天影视| 欧美精品一区二区三区高清aⅴ| 天堂а√在线中文在线新版| 欧美韩国日本一区| 中国特级黄色片| 日日欢夜夜爽一区| 9191国产视频| 国产精品自拍区| 91精品国产91久久久久青草| 亚洲天堂av影院| 久久手机免费视频| 日韩欧美电影在线观看| 欧美一区二区三级| 欧美一区二区三区网站| 亚洲久草在线视频| 女~淫辱の触手3d动漫| 国产精品影音先锋| 无码无遮挡又大又爽又黄的视频| 伊人久久大香线| 日本一区二区三区四区在线观看 | 九色porny自拍视频在线播放| 亚洲午夜色婷婷在线| 亚洲精品久久久久久久久久| 欧美综合在线视频| 日本系列第一页| 成人欧美一区二区三区小说| 亚洲av无码一区二区二三区| 国产激情偷乱视频一区二区三区| 91蝌蚪视频在线观看| 精品999成人| 免费观看黄色的网站| 免费精品国产| 国产伦精品一区二区三区高清版 | xxxx成人| 久久夜色精品亚洲噜噜国产mv| 噜噜噜噜噜在线视频| 欧美va亚洲va香蕉在线| 国产乱淫av免费| 欧美图片一区二区三区| 六月丁香激情综合| 亚洲一区在线电影| 澳门黄色一级片| 中文字幕制服丝袜成人av| 青青草视频成人| 99精品视频一区| 亚洲午夜久久久久久久久| 韩国毛片一区二区三区| 黄色三级视频在线| 日韩精品久久久久久| 妺妺窝人体色www在线小说| 成人乱码手机视频| 国产精品视频xxx| 国产综合色区在线观看| 7m第一福利500精品视频| 免费在线播放电影| 欧美日本高清视频| 性爱视频在线播放| 蜜臀久久99精品久久久无需会员| 黄色在线播放网站| 久久精品成人一区二区三区| 欧美三级黄网| 久久韩国免费视频| 老司机精品视频在线观看6| 久久人人爽人人爽人人片亚洲| 在线播放毛片| 久久人人爽人人爽爽久久| 国产传媒在线播放| 久热精品在线视频| 青青在线视频| 久久免费福利视频| 大菠萝精品导航| 91成人免费观看网站| 免费h在线看| 国产成人一区三区| 中文字幕免费高清电视剧网站在线观看| 最近2019中文字幕一页二页| 色影院视频在线| 久久亚洲国产精品成人av秋霞| 国产传媒在线播放| 97免费中文视频在线观看| 国产不卡人人| 国产成人激情视频| 亚洲伊人精品酒店| 成人av免费电影| 欧美一区 二区| 欧美日韩在线播放一区二区| 精品国产不卡| 水蜜桃亚洲一二三四在线| 天天超碰亚洲| av免费看网址| 日本女优在线视频一区二区| www亚洲成人| 国产成人免费视频网站| 久久午夜夜伦鲁鲁片| 欧美高清在线一区| 青青青在线视频| 色婷婷av一区二区三区之一色屋| 在线观看国产小视频| 欧美电视剧在线看免费| 日本v片在线免费观看| 日韩视频―中文字幕| 2001个疯子在线观看| 国产精品成久久久久三级| 伊人www22综合色| 日本10禁啪啪无遮挡免费一区二区| 91成人精品| 116极品美女午夜一级| 精品一区二区三区免费| 中文字幕一区二区久久人妻网站 | 亚洲自拍三区| 激情综合自拍| gogogo高清免费观看在线视频| 成人h精品动漫一区二区三区| 成人黄色免费网址| 亚洲国产精品嫩草影院| 最近中文在线观看| 亚洲精品电影网| 国产精品va在线观看视色| 青青草原成人在线视频| 精品中文字幕一区二区三区四区| 免费在线一区二区| 黄色成人在线网址| 欧美美女一级片| 久久精品人人做| 国产真人真事毛片| 制服丝袜激情欧洲亚洲| 青青操视频在线| 久久久久久成人精品| 欧美激情啪啪| 色噜噜狠狠一区二区三区| 欧美伊人影院| 天天看片天天操| 久久九九影视网| 国产精品午夜影院| 欧美成人一级视频| 国产原创精品视频| 国产精品日韩欧美| 伊人久久大香线蕉无限次| 国产美女主播在线| 国产成人在线视频网址| 色哟哟一一国产精品| 欧美视频第二页| 黄色毛片在线观看| 青草成人免费视频| 亚洲第一福利社区| 国产午夜伦鲁鲁| www..com久久爱| 国产一卡二卡在线播放| 日韩色在线观看| 中文字幕伦理免费在线视频 | caoporm在线视频| 国产精品久久久久久久浪潮网站| 国产伦精品一区二区三区视频我| 亚洲激情自拍图| 鲁鲁在线中文| 久热国产精品视频一区二区三区| 亚洲高清免费| 国产精品扒开腿做爽爽爽a片唱戏 亚洲av成人精品一区二区三区 | 能直接看的av| 中文字幕一区二区三区在线不卡| 日日噜噜噜噜人人爽亚洲精品| 精品国产一区二区三区久久久| 国产乱码久久久久| 日韩av电影免费观看| 欧洲乱码伦视频免费| 日本wwww视频| 久久久久久久久久久黄色| 国产91精品一区| 亚洲性线免费观看视频成熟| 18禁一区二区三区| 国产精品普通话对白| 日本少妇一级片| 一区二区三区欧美日| 精品人妻伦一区二区三区久久| 久久精品国产欧美激情| 日韩毛片网站| 国产女主播av| www.日韩大片| 久久久久久无码精品大片| 夜夜嗨av一区二区三区免费区 | 国产午夜精品理论片a级大结局| 可以免费在线观看的av| 亚洲人成电影网站| 国产成+人+综合+亚洲欧美| 国产对白在线播放| 成年人国产精品| 日本一本在线观看| 久久综合伊人77777蜜臀| 91欧美极品| 无码日韩人妻精品久久蜜桃| 中文字幕在线观看一区二区| 国产后入清纯学生妹| 久久欧美在线电影| 国产精品亚洲片在线播放| 性欧美在线视频| 天天综合网天天综合色| 爱久久·www| 不卡视频一区二区三区| 日韩制服丝袜av| 曰本女人与公拘交酡| 亚洲女同精品视频| 九九99久久精品在免费线bt| 人妻久久久一区二区三区| 亚洲国产精品二十页| 国产91麻豆视频| 国产精品免费视频xxxx| 黄色另类av| 亚洲综合图片一区| 亚洲精品720p| 国产免费av国片精品草莓男男| 欧美国产亚洲一区| 亚洲三级在线免费| 男人天堂综合| 91手机在线播放| 美女脱光内衣内裤视频久久网站 | 瑟瑟视频在线| 另类视频在线观看+1080p|