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