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