MyBatis利用MyCat實(shí)現(xiàn)多租戶的簡(jiǎn)單思路分享
前言
本文的多租戶是基于多數(shù)據(jù)庫進(jìn)行實(shí)現(xiàn)的,數(shù)據(jù)是通過不同數(shù)據(jù)庫進(jìn)行隔離。下面話不多說,來看看詳細(xì)的介紹:
MyCat 基本配置
首先針對(duì)多租戶配置了多個(gè)數(shù)據(jù)庫,在 MyCat 的 schema.xml 中配置了多個(gè) schema。
在 server.xml 中配置了一個(gè)用戶:
后面會(huì)使用 MyCat 注解(就是注釋)方式根據(jù)不同的標(biāo)識(shí),將操作指向不同的數(shù)據(jù)庫。
過濾器識(shí)別請(qǐng)求匹配對(duì)應(yīng)的數(shù)據(jù)庫
標(biāo)識(shí)有很多種方式可以加以區(qū)分,下面使用最簡(jiǎn)單的一種,通過不同的二級(jí)域名進(jìn)行識(shí)別。二級(jí)域名和數(shù)據(jù)庫對(duì)應(yīng)的信息可以通過全局庫或者公共庫進(jìn)行存儲(chǔ),還可以是簡(jiǎn)單的配置文件進(jìn)行配置,不過下面代碼只是為了演示,因此配置信息都是寫死在代碼中的。
假設(shè)存在以下二級(jí)域名,分別對(duì)應(yīng)不同的數(shù)據(jù)庫:
- ui1.mybatis.tk :UI1
- ui2.mybatis.tk :UI2
- ui3.mybatis.tk :UI3
通過過濾器,在用戶請(qǐng)求時(shí)根據(jù)請(qǐng)求地址設(shè)置當(dāng)前請(qǐng)求使用的數(shù)據(jù)庫:
這段代碼只是很簡(jiǎn)單的判斷,根據(jù)不同的字符串設(shè)置不同的數(shù)據(jù)庫。使用了一個(gè)靜態(tài)的本地線程變量來存儲(chǔ)數(shù)據(jù)庫信息。
重寫 MyBatis 的 MappedStatement 簡(jiǎn)單實(shí)現(xiàn) MyCat 注解
使用 MyBatis 和數(shù)據(jù)庫進(jìn)行操作時(shí),所有執(zhí)行的 sql 都是通過 MappedStatement 獲取的,雖然通過攔截器方式也能給 sql 添加注解,但是實(shí)現(xiàn)起來有點(diǎn)復(fù)雜。通過重寫 MappedStatement 會(huì)簡(jiǎn)單很多,但是你也需要保證重寫的這個(gè)類能夠替代默認(rèn)的類。
重寫很簡(jiǎn)單,只需要修改原有的 getBoundSql 方法:
這段代碼就是在返回 BoundSql 前,修改 sql,添加 /*!mycat:schema=數(shù)據(jù)庫*/
,具體的數(shù)據(jù)庫從過濾器的靜態(tài)方法獲取,由于每一個(gè)請(qǐng)求都會(huì)經(jīng)過過濾器(特別注意,如果是任務(wù)一類的調(diào)用,不需要經(jīng)過過濾器,這種情況需要處理任務(wù)執(zhí)行時(shí)數(shù)據(jù)庫的綁定,這需要根據(jù)具體業(yè)務(wù)實(shí)現(xiàn)),因此這里的操作一定能獲取到具體的數(shù)據(jù)庫。增加這個(gè)注解后,MyCat 執(zhí)行時(shí)就會(huì)自動(dòng)將數(shù)據(jù)庫的操作發(fā)送到指定的數(shù)據(jù)庫上執(zhí)行,通過這種方式就實(shí)現(xiàn)了一種簡(jiǎn)單的多租戶方式。
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來一定的幫助,如有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
- mysql mycat 中間件安裝與使用
- mycat在windows環(huán)境下的安裝和啟動(dòng)
- 基于mysql+mycat搭建穩(wěn)定高可用集群負(fù)載均衡主備復(fù)制讀寫分離操作
- 利用mycat實(shí)現(xiàn)mysql數(shù)據(jù)庫讀寫分離的示例
- 數(shù)據(jù)庫中間件MyCat的介紹
- SpringBoot整合MyCat實(shí)現(xiàn)讀寫分離的方法
- 簡(jiǎn)單了解mysql mycat 中間件
- Linux如何使用 MyCat 實(shí)現(xiàn) MySQL 主從讀寫分離
- MyCat環(huán)境搭建詳細(xì)教程
- 高效數(shù)據(jù)流轉(zhuǎn):Mycat分庫分表與GreatSQL實(shí)時(shí)同步
相關(guān)文章
Mybatis的插件運(yùn)行原理及如何編寫一個(gè)插件
這篇文章主要介紹了Mybatis的插件運(yùn)行原理及如何編寫一個(gè)插件 ,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07關(guān)于ElasticSearch的常用增刪改查DSL和代碼
這篇文章主要介紹了關(guān)于ElasticSearch的常用增刪改查DSL和代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-04-04JavaEE通過response實(shí)現(xiàn)請(qǐng)求重定向
這篇文章主要介紹了JavaEE通過response實(shí)現(xiàn)請(qǐng)求重定向的方法,非常的簡(jiǎn)單實(shí)用,有需要的朋友可以參考下2014-10-10SpringBoot下使用自定義監(jiān)聽事件的流程分析
事件機(jī)制是Spring的一個(gè)功能,目前我們使用了SpringBoot框架,所以記錄下事件機(jī)制在SpringBoot框架下的使用,同時(shí)實(shí)現(xiàn)異步處理,這篇文章主要介紹了SpringBoot下使用自定義監(jiān)聽事件,需要的朋友可以參考下2023-08-08Java索引越界異常Exception java.lang.IndexOutOfBoundsException
本文主要介紹了Java索引越界異常Exception java.lang.IndexOutOfBoundsException的解決,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06如何應(yīng)對(duì)spring框架的HTTP ERROR 400 Bad Request錯(cuò)
這篇文章主要介紹了如何應(yīng)對(duì)spring框架的HTTP ERROR 400 Bad Request錯(cuò)誤返回問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-08-08rabbitmq使用springboot實(shí)現(xiàn)direct模式(最新推薦)
這篇文章主要介紹了rabbitmq使用springboot實(shí)現(xiàn)direct模式,本文通過示例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07Spring中的Schedule動(dòng)態(tài)添加修改定時(shí)任務(wù)詳解
這篇文章主要介紹了Spring中的Schedule動(dòng)態(tài)添加修改定時(shí)任務(wù)詳解,可能有人會(huì)問,為啥不用Quartz,Quartz自然是非常方便強(qiáng)大的,但不是本篇要講的內(nèi)容,本篇就偏要使用SpringSchedule來實(shí)現(xiàn)動(dòng)態(tài)的cron表達(dá)式任務(wù),需要的朋友可以參考下2023-11-11