欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

簡單易懂的MyBatis分庫分表方案分享

 更新時間:2019年03月13日 10:22:39   作者:互聯(lián)網(wǎng)Java填坑之路  
這篇文章主要給大家介紹了關(guān)于MyBatis分庫分表方案的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者使用MyBatis具有一定的參考學(xué)習(xí)價值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧

前言

數(shù)據(jù)庫分庫分表除了使用中間件來代理請求分發(fā)之外,另外一種常見的方法就是在客戶端層面來分庫分表 —— 通過適當(dāng)?shù)匕b客戶端代碼使得分庫分表的數(shù)據(jù)庫訪問操作代碼編寫起來也很方便。本文的分庫分表方案基于 MyBatis 框架,但是又不同于市面上常用的方案,它們一般都是通過編寫復(fù)雜的 MyBatis 插件來重寫 SQL 語句,這樣的插件代碼會巨復(fù)雜無比,可能最終只有插件的原作者自己可以完全吃透相關(guān)代碼,給項目的維護(hù)性帶來一定問題。本文的方案非常簡單易懂,而且也不失使用上的便捷性。它的設(shè)計哲學(xué)來源于 Python —— Explicit is better than Implicit,也就是顯式優(yōu)于隱式,它不會將分庫分表的過程隱藏起來。

很多分庫分表的設(shè)計在實現(xiàn)上會盡量將分庫分表的邏輯隱藏起來,其實這是毫無必要的。使用者必須知道背后確實進(jìn)行了分庫分表,否則他怎么會無法進(jìn)行全局的索引查找?他怎么會無法隨意進(jìn)行多表的 join 操作。如果你真的將它當(dāng)成單表來用,到上線時必然會出大問題。

項目名稱叫:shardino,項目地址:https://github.com/pyloque/shardino

接下來我們來看看在本文的方案之下,數(shù)據(jù)庫操作代碼的形式是怎樣的帖子表一共分出來 64 個表,不同的記錄會各自分發(fā)到其中一個表,可以是按 hash 分發(fā),也可以按照日期分發(fā),分發(fā)邏輯由用戶代碼自己來決定。在不同的環(huán)境中可以將分表數(shù)量設(shè)置為不同的值,比如在單元測試下分表設(shè)為 4 個,而線上可能需要設(shè)置為 64 個。

帖子表又會被分配到多個庫,這里就直接取模分配。假設(shè)有 4 個帖子庫,帖子表總共分出來 64 個表,分別是 post_0、post_1、post_2 一直到 post_63。那么 post_0、post_4、post_8 等分配到 0 號庫,post_1、post_5、post_9 等分配到 1 號庫,post_2、post_6、post_10 等分配到 2 號庫,post_3、post_5、post_11 等分配到 4 號庫。

從配置文件中構(gòu)建 MySQLGroupStore 數(shù)據(jù)庫組對象,這個對象是我們執(zhí)行 MySQL 操作的入口,通過它可以找到具體的物理的 MySQL 主從數(shù)據(jù)源。

配置文件 application.properties 如下

這里的數(shù)據(jù)庫組是由多個對等的 Master-Slaves 對構(gòu)成,每個 Master-Slaves 是由一個主庫和多個不同權(quán)重的從庫構(gòu)成,Master-Slaves 對的數(shù)量就是分庫的數(shù)量。

mysqlgroup 還有一個特殊的配置選項 slaveEnabled 來控制是否需要從庫,從而關(guān)閉讀寫分離,默認(rèn)是關(guān)閉的,這樣就不會去構(gòu)建從庫實例相關(guān)對象。

post_k 這張表后綴 k 我們稱之為 partition number,也就是后續(xù)代碼中到處在用的 partition 變量,表明當(dāng)前的記錄被分配到對應(yīng)物理數(shù)據(jù)表的序號。我們需要根據(jù)記錄的內(nèi)容計算出 partition number,再根據(jù) partition number 決定出這條記錄所在的物理表屬于那個物理數(shù)據(jù)庫,然后對這個物理數(shù)據(jù)庫進(jìn)行相應(yīng)的讀寫操作。

在本例中,帖子表按照 userId 字段 hash 出 64 張表,平均分配到 2 對物理庫中,每個物理庫包含一個主庫和2個從庫。

有了 MySQLGroupStore 實例,我們就可以盡情操縱所有數(shù)據(jù)庫了。

從上面的代碼中可以看出所有的讀寫、創(chuàng)建、刪除表操作的第一步都是計算出 partition number,然后根據(jù)它來選出目標(biāo)主從庫再進(jìn)一步對目標(biāo)的數(shù)據(jù)表進(jìn)行操作。這里我默認(rèn)開啟了autocommit,所以不需要顯式來 session.commit() 了。

在對數(shù)據(jù)表的操作過程中,又需要將具體的 partition number 傳遞過去,如此 MyBatis 才能知道具體操作的是哪個分表。

在每一條數(shù)據(jù)庫操作中都必須帶上 partition 參數(shù),你可能會覺得這有點(diǎn)繁瑣。但是這也很直觀,它明確地告訴我們目前正在操作的是哪一個具體的分表。在 MyBatis 的注解 Mapper 類中,如果方法含有多個參數(shù),需要使用 @Param 注解進(jìn)行名稱標(biāo)注,這樣才可以在 SQL 語句中直接使用相應(yīng)的注解名稱。否則你得使用默認(rèn)的變量占位符名稱 param0、param1 來表示,這就很不直觀。我們將分表的 hash 算法寫在實體類 Post 中,這里使用 CRC32 算法進(jìn)行 hash。

代碼中的 partitionFor 方法的參數(shù) num 就是一共要分多少表。如果是按日期來分表,這個參數(shù)可能就不需要,直接返回日期的整數(shù)就行比如 20190304。

還有最后一個問題是多個帶權(quán)重的從庫是如何做到概率分配的。這里就要使用到 spring-jdbc 自帶的 AbstractRoutingDataSource —— 帶路由功能的數(shù)據(jù)源。它可以包含多個子數(shù)據(jù)源,然后根據(jù)一定的策略算法動態(tài)挑選出一個數(shù)據(jù)源來,這里就是使用權(quán)重隨機(jī)。

但是有個問題,我這里只需要這一個類,但是需要引入整個 spring-boot-jdbc-starter 包,有點(diǎn)拖泥帶水的感覺。我研究了一下 AbstractRoutingDataSource 類的代碼,發(fā)現(xiàn)它的實現(xiàn)非常簡單,如果就仿照它自己實現(xiàn)了一個簡單版的,這樣就不需要引入整個包代碼了。

還需進(jìn)一步深入理解其實現(xiàn)代碼的可以將 shardino 代碼倉庫拉到本地跑一跑

里面有單元測試可以運(yùn)行起來,運(yùn)行之前需要確保本機(jī)安裝了 docker 環(huán)境

這條指令會啟動2對主從庫,各1主兩從。在本例中雖然用到了 springboot ,其實也只是用了它方便的依賴注入和單元測試功能,shardino 完全可以脫離 springboot 而獨(dú)立存在。shardino 并不是一個完美的開源庫,它只是一份實現(xiàn)代碼的樣板,如果讀者使用的是其它數(shù)據(jù)庫或者 MySQL 的其它版本,那就需要自己微調(diào)一下代碼來適配了。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 詳解Spring的@Value作用與使用場景

    詳解Spring的@Value作用與使用場景

    這篇文章主要介紹了詳解Spring的@Value作用與使用場景,Spring為大家提供許多開箱即用的功能,@Value就是一個極其常用的功能,它能將配置信息注入到bean中去,需要的朋友可以參考下
    2023-05-05
  • java如何利用FastJSON、Gson、Jackson三種Json格式工具自定義時間序列化

    java如何利用FastJSON、Gson、Jackson三種Json格式工具自定義時間序列化

    本篇文章主要介紹了java如何利用FastJSON、Gson、Jackson三種Json格式工具自定義時間序列化,具有一定的參考價值,有興趣的可以了解一下
    2017-08-08
  • java獲取微信accessToken的方法

    java獲取微信accessToken的方法

    這篇文章主要為大家詳細(xì)介紹了java獲取微信accessToken的方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-09-09
  • Java 條件控制與循環(huán)控制實例

    Java 條件控制與循環(huán)控制實例

    下面小編就為大家?guī)硪黄狫ava 條件控制與循環(huán)控制實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-05-05
  • Spring?Boot整合Kafka教程詳解

    Spring?Boot整合Kafka教程詳解

    這篇文章主要為大家介紹了Spring?Boot整合Kafka教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-03-03
  • Java實現(xiàn)俄羅斯方塊游戲的示例代碼

    Java實現(xiàn)俄羅斯方塊游戲的示例代碼

    俄羅斯方塊是一個最初由阿列克謝帕吉特諾夫在蘇聯(lián)設(shè)計和編程的益智類視頻游戲。本文將利用Java實現(xiàn)這一經(jīng)典的小游戲,感興趣的可以動手試一試
    2022-03-03
  • java中的按位與(&)用法說明

    java中的按位與(&)用法說明

    這篇文章主要介紹了java中的按位與(&)用法說明,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • Spring Boot + FreeMarker 實現(xiàn)動態(tài)Word文檔導(dǎo)出功能

    Spring Boot + FreeMarker 實現(xiàn)動態(tài)Word文檔導(dǎo)出功能

    Spring Boot與FreeMarker的組合,為開發(fā)者提供了一個強(qiáng)大的平臺,可以輕松實現(xiàn)動態(tài)Word文檔的導(dǎo)出,本文將指導(dǎo)你如何使用Spring Boot與FreeMarker模板引擎,創(chuàng)建一個簡單的應(yīng)用,用于根據(jù)數(shù)據(jù)庫數(shù)據(jù)動態(tài)生成Word文檔并下載,感興趣的朋友一起看看吧
    2024-06-06
  • java.lang.Runtime.exec() Payload知識點(diǎn)詳解

    java.lang.Runtime.exec() Payload知識點(diǎn)詳解

    在本篇文章里小編給大家整理的是一篇關(guān)于java.lang.Runtime.exec() Payload知識點(diǎn)相關(guān)內(nèi)容,有興趣的朋友們學(xué)習(xí)下。
    2020-03-03
  • Springboot+MybatisPlus+Oracle實現(xiàn)主鍵自增的示例代碼

    Springboot+MybatisPlus+Oracle實現(xiàn)主鍵自增的示例代碼

    這篇文章主要介紹了Springboot+MybatisPlus+Oracle實現(xiàn)主鍵自增的示例代碼,本文通過實例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-11-11

最新評論