1. 引言
讀寫分離要做的事情就是對于一條SQL該選擇哪個數(shù)據(jù)庫去執(zhí)行羊异,至于誰來做選擇數(shù)據(jù)庫這件事兒,無非兩個捉撮,要么中間件幫我們做怕品,要么程序自己做。因此巾遭,一般來講肉康,讀寫分離有兩種實現(xiàn)方式。第一種是依靠中間件(比如:MyCat)灼舍,也就是說應(yīng)用程序連接到中間件吼和,中間件幫我們做SQL分離;第二種是應(yīng)用程序自己去做分離片仿。這里我們選擇程序自己來做纹安,主要是利用Spring提供的路由數(shù)據(jù)源,以及AOP。
然而厢岂,應(yīng)用程序?qū)用嫒プ鲎x寫分離最大的弱點(不足之處)在于無法動態(tài)增加數(shù)據(jù)庫節(jié)點光督,因為數(shù)據(jù)源配置都是寫在配置中的,新增數(shù)據(jù)庫意味著新加一個數(shù)據(jù)源塔粒,必然改配置结借,并重啟應(yīng)用。當(dāng)然卒茬,好處就是相對簡單船老。
2. AbstractRoutingDataSource
基于特定的查找key路由到特定的數(shù)據(jù)源。它內(nèi)部維護(hù)了一組目標(biāo)數(shù)據(jù)源圃酵,并且做了路由key與目標(biāo)數(shù)據(jù)源之間的映射柳畔,提供基于key查找數(shù)據(jù)源的方法。
3. 實踐
關(guān)于配置請參考:
https://www.cnblogs.com/cjsblog/p/9706370.html
3.1. maven依賴
這里郭赐,我們配置了4個數(shù)據(jù)源薪韩,1個master,2兩個slave捌锭,1個路由數(shù)據(jù)源俘陷。前3個數(shù)據(jù)源都是為了生成第4個數(shù)據(jù)源,而且后續(xù)我們只用這最后一個路由數(shù)據(jù)源观谦。
MyBatis配置
由于Spring容器中現(xiàn)在有4個數(shù)據(jù)源拉盾,所以我們需要為事務(wù)管理器和MyBatis手動指定一個明確的數(shù)據(jù)源。
3.3. 設(shè)置路由key / 查找數(shù)據(jù)源
目標(biāo)數(shù)據(jù)源就是那前3個這個我們是知道的豁状,但是使用的時候是如果查找數(shù)據(jù)源的呢捉偏?
首先,我們定義一個枚舉來代表這三個數(shù)據(jù)源
packagecom.cjs.example.enums;
publicenumDBTypeEnum?{
MASTER,?SLAVE1,?SLAVE2;
}
接下來替蔬,通過ThreadLocal將數(shù)據(jù)源設(shè)置到每個線程上下文中
例如告私,假設(shè)我們有一張表member
4. 測試
查看控制臺
5. 工程結(jié)構(gòu)
擴(kuò)展閱讀
Springboot + Mybatis,數(shù)據(jù)庫多數(shù)據(jù)源配置項目Demo【源碼下載】
Spring+MyBatis多數(shù)據(jù)源配置實現(xiàn)(實操型)
SpringBoot?(?七?)?:springboot?+?mybatis?多數(shù)據(jù)源最簡解決方案
某小公司 RESTful承桥、共用接口驻粟、前后端分離、接口約定的實踐
MySQL 主從復(fù)制與讀寫分離概念及架構(gòu)分析
來源:http://www.cnblogs.com/cjsblog/p/9712457.html