MyBatis利用MyCat實(shí)現(xiàn)多租戶的簡(jiǎn)單思路分享
前言
本文的多租戶是基于多數(shù)據(jù)庫(kù)進(jìn)行實(shí)現(xiàn)的,數(shù)據(jù)是通過(guò)不同數(shù)據(jù)庫(kù)進(jìn)行隔離。下面話不多說(shuō),來(lái)看看詳細(xì)的介紹:
MyCat 基本配置
首先針對(duì)多租戶配置了多個(gè)數(shù)據(jù)庫(kù),在 MyCat 的 schema.xml 中配置了多個(gè) schema。

在 server.xml 中配置了一個(gè)用戶:

后面會(huì)使用 MyCat 注解(就是注釋)方式根據(jù)不同的標(biāo)識(shí),將操作指向不同的數(shù)據(jù)庫(kù)。
過(guò)濾器識(shí)別請(qǐng)求匹配對(duì)應(yīng)的數(shù)據(jù)庫(kù)
標(biāo)識(shí)有很多種方式可以加以區(qū)分,下面使用最簡(jiǎn)單的一種,通過(guò)不同的二級(jí)域名進(jìn)行識(shí)別。二級(jí)域名和數(shù)據(jù)庫(kù)對(duì)應(yīng)的信息可以通過(guò)全局庫(kù)或者公共庫(kù)進(jìn)行存儲(chǔ),還可以是簡(jiǎn)單的配置文件進(jìn)行配置,不過(guò)下面代碼只是為了演示,因此配置信息都是寫(xiě)死在代碼中的。
假設(shè)存在以下二級(jí)域名,分別對(duì)應(yīng)不同的數(shù)據(jù)庫(kù):
- ui1.mybatis.tk :UI1
- ui2.mybatis.tk :UI2
- ui3.mybatis.tk :UI3
通過(guò)過(guò)濾器,在用戶請(qǐng)求時(shí)根據(jù)請(qǐng)求地址設(shè)置當(dāng)前請(qǐng)求使用的數(shù)據(jù)庫(kù):

這段代碼只是很簡(jiǎn)單的判斷,根據(jù)不同的字符串設(shè)置不同的數(shù)據(jù)庫(kù)。使用了一個(gè)靜態(tài)的本地線程變量來(lái)存儲(chǔ)數(shù)據(jù)庫(kù)信息。
重寫(xiě) MyBatis 的 MappedStatement 簡(jiǎn)單實(shí)現(xiàn) MyCat 注解
使用 MyBatis 和數(shù)據(jù)庫(kù)進(jìn)行操作時(shí),所有執(zhí)行的 sql 都是通過(guò) MappedStatement 獲取的,雖然通過(guò)攔截器方式也能給 sql 添加注解,但是實(shí)現(xiàn)起來(lái)有點(diǎn)復(fù)雜。通過(guò)重寫(xiě) MappedStatement 會(huì)簡(jiǎn)單很多,但是你也需要保證重寫(xiě)的這個(gè)類能夠替代默認(rèn)的類。
重寫(xiě)很簡(jiǎn)單,只需要修改原有的 getBoundSql 方法:

這段代碼就是在返回 BoundSql 前,修改 sql,添加 /*!mycat:schema=數(shù)據(jù)庫(kù)*/,具體的數(shù)據(jù)庫(kù)從過(guò)濾器的靜態(tài)方法獲取,由于每一個(gè)請(qǐng)求都會(huì)經(jīng)過(guò)過(guò)濾器(特別注意,如果是任務(wù)一類的調(diào)用,不需要經(jīng)過(guò)過(guò)濾器,這種情況需要處理任務(wù)執(zhí)行時(shí)數(shù)據(jù)庫(kù)的綁定,這需要根據(jù)具體業(yè)務(wù)實(shí)現(xiàn)),因此這里的操作一定能獲取到具體的數(shù)據(jù)庫(kù)。增加這個(gè)注解后,MyCat 執(zhí)行時(shí)就會(huì)自動(dòng)將數(shù)據(jù)庫(kù)的操作發(fā)送到指定的數(shù)據(jù)庫(kù)上執(zhí)行,通過(guò)這種方式就實(shí)現(xiàn)了一種簡(jiǎn)單的多租戶方式。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- mysql mycat 中間件安裝與使用
- mycat在windows環(huán)境下的安裝和啟動(dòng)
- 基于mysql+mycat搭建穩(wěn)定高可用集群負(fù)載均衡主備復(fù)制讀寫(xiě)分離操作
- 利用mycat實(shí)現(xiàn)mysql數(shù)據(jù)庫(kù)讀寫(xiě)分離的示例
- 數(shù)據(jù)庫(kù)中間件MyCat的介紹
- SpringBoot整合MyCat實(shí)現(xiàn)讀寫(xiě)分離的方法
- 簡(jiǎn)單了解mysql mycat 中間件
- Linux如何使用 MyCat 實(shí)現(xiàn) MySQL 主從讀寫(xiě)分離
- MyCat環(huán)境搭建詳細(xì)教程
- 高效數(shù)據(jù)流轉(zhuǎn):Mycat分庫(kù)分表與GreatSQL實(shí)時(shí)同步
相關(guān)文章
SpringBoot優(yōu)雅實(shí)現(xiàn)計(jì)算方法執(zhí)行時(shí)間
這篇文章主要為大家詳細(xì)介紹了SpringBoot中優(yōu)雅實(shí)現(xiàn)計(jì)算方法執(zhí)行時(shí)間的相關(guān)方法,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-04-04
SpringBoot和Vue實(shí)現(xiàn)動(dòng)態(tài)二維碼的示例代碼
二維碼在現(xiàn)代社交和營(yíng)銷活動(dòng)中被廣泛使用,本文主要介紹了SpringBoot和Vue實(shí)現(xiàn)動(dòng)態(tài)二維碼的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02
因Spring AOP導(dǎo)致@Autowired依賴注入失敗的解決方法
這篇文章主要給大家介紹了因Spring AOP導(dǎo)致@Autowired依賴注入失敗的解決方法,文中通過(guò)示例代碼給大家介紹的非常詳細(xì),對(duì)大家具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面跟著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-07-07
@JsonSerialize(using = LongToStringUtil.class)注解的使
這篇文章主要介紹了@JsonSerialize(using = LongToStringUtil.class)注解的使用方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08
springboot本地調(diào)試沒(méi)問(wèn)題,打包運(yùn)行報(bào)錯(cuò)原因及分析
這篇文章主要介紹了springboot本地調(diào)試沒(méi)問(wèn)題,打包運(yùn)行報(bào)錯(cuò)原因及分析,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-05-05

