亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

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

2024-07-14 08:43:42
字體:
來源:轉載
供稿:網友

前言

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

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

MyBatis,分庫分表

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

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

MyBatis,分庫分表

帖子表又會被分配到多個庫,這里就直接取模分配。假設有 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 號庫。

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

MyBatis,分庫分表

配置文件 application.properties 如下

MyBatis,分庫分表

這里的數據庫組是由多個對等的 Master-Slaves 對構成,每個 Master-Slaves 是由一個主庫和多個不同權重的從庫構成,Master-Slaves 對的數量就是分庫的數量。

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

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

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

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

MyBatis,分庫分表

MyBatis,分庫分表

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

MyBatis,分庫分表

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

MyBatis,分庫分表

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

MyBatis,分庫分表

MyBatis,分庫分表

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

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

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

MyBatis,分庫分表

還需進一步深入理解其實現代碼的可以將 shardino 代碼倉庫拉到本地跑一跑

MyBatis,分庫分表

里面有單元測試可以運行起來,運行之前需要確保本機安裝了 docker 環境

MyBatis,分庫分表

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

總結

以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,謝謝大家對VeVb武林網的支持。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
国产美女主播一区| 性夜试看影院91社区| www日韩中文字幕在线看| 久久青草精品视频免费观看| 久久久久久欧美| 亚洲va欧美va国产综合久久| 国产综合福利在线| 日本精品一区二区三区在线播放视频| 国产精品日韩久久久久| 51色欧美片视频在线观看| 国产精品96久久久久久又黄又硬| 久久久久久久久中文字幕| 中文字幕不卡在线视频极品| 色综合91久久精品中文字幕| 青青a在线精品免费观看| 亚洲欧美精品在线| 青青草99啪国产免费| 国产91精品久| 欧美午夜精品久久久久久人妖| 欧美自拍视频在线| 色久欧美在线视频观看| 国产精品视频自拍| 欧美国产日韩一区| 亚洲激情久久久| 亚洲第一精品自拍| 日韩精品中文字幕视频在线| 中文字幕日韩综合av| 狠狠躁18三区二区一区| 久久精品中文字幕电影| 最好看的2019的中文字幕视频| 欧美孕妇毛茸茸xxxx| 精品伊人久久97| 亚洲福利视频专区| 91久久精品一区| 亚洲精品美女网站| 91成人国产在线观看| 操日韩av在线电影| 日韩精品免费在线观看| 亚洲美女久久久| 91精品国产综合久久久久久蜜臀| 亚洲自拍偷拍一区| 中日韩美女免费视频网站在线观看| 国产美女精品免费电影| 欧美久久精品午夜青青大伊人| 国产亚洲精品美女久久久久| 超碰精品一区二区三区乱码| 久久精品久久久久电影| 久久99热这里只有精品国产| 日韩精品在线视频美女| 国产自产女人91一区在线观看| 久久成人人人人精品欧| 成人中文字幕在线观看| 精品久久久久久中文字幕一区奶水| 久久精视频免费在线久久完整在线看| 91欧美激情另类亚洲| 九九热视频这里只有精品| 精品女同一区二区三区在线播放| 中文字幕日韩精品有码视频| 精品国产一区二区三区久久狼5月| 成人国产精品免费视频| 国外色69视频在线观看| 韩日欧美一区二区| 欧美一性一乱一交一视频| 日韩免费黄色av| 亚洲国产精品人人爽夜夜爽| 91久久久久久久久| 国产精品高清在线| 久久久国产精品x99av| 精品亚洲aⅴ在线观看| 伊人伊人伊人久久| 欧美诱惑福利视频| 91在线视频一区| 96精品视频在线| 91国产精品91| 亚洲高清一二三区| 91国在线精品国内播放| 日韩亚洲在线观看| 热久久99这里有精品| 92版电视剧仙鹤神针在线观看| 欧美日韩中文在线| 欧美激情精品久久久久久免费印度| 欧美另类xxx| 精品女同一区二区三区在线播放| 国产成人在线精品| 久久九九有精品国产23| 超碰97人人做人人爱少妇| 国产精品亚洲欧美导航| 色综合久久中文字幕综合网小说| 午夜精品在线视频| 亚洲第一精品夜夜躁人人爽| 欧美激情xxxxx| 精品国产一区二区三区久久狼黑人| 中文字幕欧美精品在线| 色噜噜狠狠狠综合曰曰曰88av| 久久色免费在线视频| 日韩精品高清在线| 久久久伊人欧美| 国产精品日韩在线| 欧美国产亚洲视频| 国产成人精品久久二区二区| 精品久久久久久久中文字幕| 中文字幕国产亚洲| 欧美日韩人人澡狠狠躁视频| 国产精品成人免费视频| 国产成人精品在线播放| 国产欧美精品一区二区三区介绍| 国产精品69精品一区二区三区| 538国产精品一区二区免费视频| 国产精品久久91| 久久久久久久久久国产| 日韩av资源在线播放| 国产精品久久久一区| 国产精品成人免费电影| 国模精品视频一区二区| 亚洲国模精品私拍| 久久色免费在线视频| 国产精品99久久久久久久久| 亚洲欧美999| 欧美午夜激情小视频| 亚洲人成绝费网站色www| 成人激情视频小说免费下载| 欧美激情视频一区二区| 91久热免费在线视频| 亚洲爱爱爱爱爱| 97精品一区二区三区| 日韩精品在线免费观看视频| 亚洲www在线| 日韩高清有码在线| 日韩欧美国产骚| 欧美成人剧情片在线观看| 91久热免费在线视频| 国产日本欧美视频| 亚洲第一色在线| 亚洲欧美综合另类中字| 精品国偷自产在线视频99| 日韩精品免费在线视频| 91精品视频在线免费观看| 国模gogo一区二区大胆私拍| 亚洲精品视频在线播放| 国产精品男人的天堂| 成人福利在线观看| 精品久久久香蕉免费精品视频| 国产欧美日韩免费看aⅴ视频| 国产日产欧美精品| 国产suv精品一区二区| 国产成人精品视频在线观看| 久久久精品免费视频| 欧美一区二区三区精品电影| 久久天天躁日日躁| 久久精品国产亚洲精品| 久久久av一区| 精品亚洲精品福利线在观看| 91免费看片在线| 在线观看精品国产视频| 91精品久久久久久久久久另类| 中文字幕一区二区精品| 久久九九有精品国产23| 久久99精品久久久久久琪琪| 亚洲成人精品久久| 欧美色videos| 国产精品扒开腿做| 91精品国产91久久久久久不卡| 欧美在线影院在线视频| 久久精品国产视频|