簡(jiǎn)介
前面兩篇文章主要講了數(shù)據(jù)庫(kù)讀寫分離和分表分庫(kù)的一些問(wèn)題,這篇文章主要講一下我個(gè)人實(shí)現(xiàn)的一個(gè)分表分庫(kù)項(xiàng)目。
在此之前,我有寫過(guò)一個(gè).Net的分庫(kù),最近在做Java的項(xiàng)目,就順便做出一個(gè)Java版本,這個(gè)項(xiàng)目源于我另外的一個(gè)業(yè)務(wù)項(xiàng)目,在這個(gè)業(yè)務(wù)項(xiàng)目中有分表(在一個(gè)數(shù)據(jù)庫(kù)下有多張表),當(dāng)時(shí)寫了一套基于分表的幫助類,隨著這個(gè)業(yè)務(wù)的的發(fā)展,基于分表的解決方案有一定的弊端,主要有兩個(gè):
1. 不能很好的擴(kuò)展,在一個(gè)數(shù)據(jù)庫(kù)下面有20張表,當(dāng)業(yè)務(wù)繁忙的時(shí)候,數(shù)據(jù)庫(kù)出現(xiàn)了壓力(公司里面多個(gè)項(xiàng)目共用一個(gè)數(shù)據(jù)庫(kù)服務(wù)器,有可能是其他項(xiàng)目影響了我的項(xiàng)目),這個(gè)時(shí)候想要擴(kuò)展就比較麻煩了, 我可以將其中10張表遷移到另外的機(jī)器,同時(shí)我的代碼路由算法就要改,其實(shí)將其中10張表遷移到另外服務(wù)器上,就已經(jīng)類似于分庫(kù)了。
2. 基于分表對(duì)業(yè)務(wù)的侵入性較高,我要先通過(guò)算法得到具體的表索引(即表的編號(hào),比如user_15),然后要將整個(gè)索引和表前綴進(jìn)行拼接才能得到真正的表名。
所以在開源分表分庫(kù)的項(xiàng)目的時(shí)候,我對(duì)項(xiàng)目進(jìn)行了升級(jí),改為分庫(kù)模式,即有多個(gè)數(shù)據(jù)庫(kù),每個(gè)數(shù)據(jù)庫(kù)一張表,表名都一樣,這樣你就可以在mybatis中不需要再對(duì)表名進(jìn)行修改。 降低了浸入性,同時(shí)也方便后續(xù)的擴(kuò)展,你可以將這些數(shù)據(jù)庫(kù)放在一臺(tái)機(jī)器上,也可以在后續(xù)數(shù)據(jù)庫(kù)服務(wù)器性能緊張的時(shí)候,將一部分?jǐn)?shù)據(jù)庫(kù)遷移到其他機(jī)器上。
最后說(shuō)一下我當(dāng)時(shí)為什么沒(méi)有選擇開源的解決方案,目前我知道的開源方案包括 sharding-jdbc ,mycat ,但是當(dāng)時(shí)時(shí)間緊,任務(wù)重,研究熟悉部署這些項(xiàng)目,可能需要1-2天的時(shí)間,并且后續(xù)使用過(guò)程中,出了問(wèn)題,還需要花時(shí)間排查,mycat 是基于分庫(kù)的,所以并不適合我這個(gè)項(xiàng)目,而我的項(xiàng)目中,在操作數(shù)據(jù)庫(kù)之前,已經(jīng)可以知道具體要操作哪張表,對(duì)分表的操作也比較簡(jiǎn)單,但是要得到具體的表索引比較麻煩,是要經(jīng)過(guò)多個(gè)key運(yùn)算得到的,綜合所有,我選擇了自己寫了一個(gè)。
項(xiàng)目介紹
項(xiàng)目比較簡(jiǎn)單,所有和分庫(kù)相關(guān)的都在shardingcore中。 test是測(cè)試用的。
shardingcore的項(xiàng)目結(jié)構(gòu)。
其中MultipleDataSource是為了實(shí)現(xiàn)切換數(shù)據(jù)庫(kù)連接,這塊代碼是參考網(wǎng)上數(shù)據(jù)庫(kù)讀寫分離的。
ShardingDBAspect是分庫(kù)的核心代碼。
延伸閱讀
- ssh框架 2016-09-30
- 阿里移動(dòng)安全 [無(wú)線安全]玩轉(zhuǎn)無(wú)線電——不安全的藍(lán)牙鎖 2017-07-26
- 消息隊(duì)列NetMQ 原理分析4-Socket、Session、Option和Pipe 2024-03-26
- Selective Search for Object Recognition 論文筆記【圖片目標(biāo)分割】 2017-07-26
- 詞向量-LRWE模型-更好地識(shí)別反義詞同義詞 2017-07-26
- 從棧不平衡問(wèn)題 理解 calling convention 2017-07-26
- php imagemagick 處理 圖片剪切、壓縮、合并、插入文本、背景色透明 2017-07-26
- Swift實(shí)現(xiàn)JSON轉(zhuǎn)Model - HandyJSON使用講解 2017-07-26
- 阿里移動(dòng)安全 Android端惡意鎖屏勒索應(yīng)用分析 2017-07-26
- 集合結(jié)合數(shù)據(jù)結(jié)構(gòu)來(lái)看看(二) 2017-07-26