最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

簡(jiǎn)單易懂的MyBatis分庫(kù)分表方案分享

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

前言

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

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

項(xiàng)目名稱(chēng)叫:shardino,項(xiàng)目地址:https://github.com/pyloque/shardino

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

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

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

配置文件 application.properties 如下

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

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

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

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

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

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

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

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

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

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

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

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

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

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

總結(jié)

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

相關(guān)文章

  • RedisTemplate.opsForHash()用法簡(jiǎn)介并舉例說(shuō)明

    RedisTemplate.opsForHash()用法簡(jiǎn)介并舉例說(shuō)明

    redistemplate.opsforhash是RedisTemplate模板類(lèi)中的一個(gè)方法,用于獲取操作哈希數(shù)據(jù)類(lèi)型的接口,這篇文章主要給大家介紹了關(guān)于RedisTemplate.opsForHash()用法簡(jiǎn)介并舉例說(shuō)明的相關(guān)資料,需要的朋友可以參考下
    2024-06-06
  • spring mvc 和ajax異步交互完整實(shí)例代碼

    spring mvc 和ajax異步交互完整實(shí)例代碼

    本篇文章主要介紹了spring mvc 和ajax異步交互完整實(shí)例代碼,簡(jiǎn)單的AJAX+SpringMVC的異步交互小例子,有興趣的可以了解一下。
    2017-02-02
  • Idea2023配置JavaWeb項(xiàng)目(最新)

    Idea2023配置JavaWeb項(xiàng)目(最新)

    本文將介紹如何配置JavaWeb項(xiàng)目,以在Idea中實(shí)現(xiàn)開(kāi)發(fā)環(huán)境,文中通過(guò)圖文介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-09-09
  • Mybatis?Example的高級(jí)用法詳解

    Mybatis?Example的高級(jí)用法詳解

    這篇文章主要介紹了Mybatis?Example的高級(jí)用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-12-12
  • jquery uploadify和apache Fileupload實(shí)現(xiàn)異步上傳文件示例

    jquery uploadify和apache Fileupload實(shí)現(xiàn)異步上傳文件示例

    這篇文章主要介紹了jquery uploadify和apache Fileupload實(shí)現(xiàn)異步上傳文件示例,需要的朋友可以參考下
    2014-05-05
  • IntelliJ?IDEA無(wú)公網(wǎng)遠(yuǎn)程Linux服務(wù)器環(huán)境開(kāi)發(fā)過(guò)程(推薦收藏)

    IntelliJ?IDEA無(wú)公網(wǎng)遠(yuǎn)程Linux服務(wù)器環(huán)境開(kāi)發(fā)過(guò)程(推薦收藏)

    下面介紹如何在IDEA中設(shè)置遠(yuǎn)程連接服務(wù)器開(kāi)發(fā)環(huán)境并結(jié)合Cpolar內(nèi)網(wǎng)穿透工具實(shí)現(xiàn)無(wú)公網(wǎng)遠(yuǎn)程連接,然后實(shí)現(xiàn)遠(yuǎn)程Linux環(huán)境進(jìn)行開(kāi)發(fā),感興趣的朋友跟隨小編一起看看吧
    2023-12-12
  • SpringBoot中的@CrossOrigin注解詳解

    SpringBoot中的@CrossOrigin注解詳解

    這篇文章主要介紹了SpringBoot中的@CrossOrigin注解詳解,跨源資源共享(CORS)是由大多數(shù)瀏覽器實(shí)現(xiàn)的W3C規(guī)范,允許您靈活地指定什么樣的跨域請(qǐng)求被授權(quán),而不是使用一些不太安全和不太強(qiáng)大的策略,需要的朋友可以參考下
    2023-11-11
  • Java設(shè)計(jì)模式中的工廠及抽象工廠模式解析

    Java設(shè)計(jì)模式中的工廠及抽象工廠模式解析

    這篇文章主要介紹了Java設(shè)計(jì)模式中的工廠及抽象工廠模式解析,工廠模式作為創(chuàng)建型設(shè)計(jì)模式中常見(jiàn)的設(shè)計(jì)方法,一般情況下,工廠模式分為3種,簡(jiǎn)單工作、工廠方法、抽象工作,其實(shí)簡(jiǎn)單工廠只是工廠方法的一種特例,需要的朋友可以參考下
    2023-12-12
  • 使用JDBC4.0操作XML類(lèi)型的字段(保存獲取xml數(shù)據(jù))的方法

    使用JDBC4.0操作XML類(lèi)型的字段(保存獲取xml數(shù)據(jù))的方法

    jdbc4.0最重要的特征是支持xml數(shù)據(jù)類(lèi)型,接下來(lái)通過(guò)本文重點(diǎn)給大家介紹如何使用jdbc4.0操作xml類(lèi)型的字段,對(duì)jdbc4.0 xml相關(guān)知識(shí)感興趣的朋友一起看下吧
    2016-08-08
  • java常見(jiàn)報(bào)錯(cuò)及解決方案總結(jié)

    java常見(jiàn)報(bào)錯(cuò)及解決方案總結(jié)

    這篇文章主要介紹了Java編程中常見(jiàn)錯(cuò)誤類(lèi)型及示例,包括語(yǔ)法錯(cuò)誤、空指針異常、數(shù)組下標(biāo)越界、類(lèi)型轉(zhuǎn)換異常、文件未找到異常、除以零異常、非法線(xiàn)程操作異常、方法未定義異常、死鎖和類(lèi)未找到異常,文中通過(guò)代碼將解決方案介紹的非常詳細(xì),需要的朋友可以參考下
    2025-03-03

最新評(píng)論

本溪| 孝昌县| 团风县| 桐梓县| 遵义县| 曲靖市| 盐边县| 沈丘县| 闸北区| 铁力市| 馆陶县| 象州县| 台山市| 南岸区| 浦城县| 马公市| 龙胜| 山东省| 开鲁县| 攀枝花市| 崇阳县| 彰武县| 井研县| 松原市| 白玉县| 平泉县| 襄城县| 梁河县| 五大连池市| 荥阳市| 化德县| 龙川县| 宝清县| 河南省| 凤凰县| 新安县| 二连浩特市| 马公市| 翁牛特旗| 永定县| 武汉市|