前言:
以前寫**, 關於mysql的分庫分表已被中介軟體服務所支援, 業務**涉及的sql已規避了這塊. 它對擴充套件友好, 你也不知道到底他分為多少庫, 多少表, 一切都是透明的.
不過對於小的團隊/工作室而言, 可能就沒有那麼強大的分布式中介軟體的基礎設施支援了, 而當資料庫上去的時候, 分庫分表就需要客戶端client這邊去支援維護了. 如何優雅地使用mybatis支援分表, 這就是本文的主題.
1. spring+mybatis的多源資料庫配置實戰
參考的博文:
1. mybatis***原理**
2. springmvc + mybatis分庫分表方案
3. 利用mybatis***對資料庫水平分表
mybatis外掛程式機制:
mybatis支援外掛程式(plugin), 講得通俗一點就是***(interceptor). 它支援parameterhandler/statementhandler/executor/resultsethandler這四個級別進行攔截.
總體概況為:
比如sql rewrite, 它屬於statementhandler的階段. 以分表實踐為例, 它可以簡單理解為把table名稱替換為分表table名稱的過程.
模擬實戰:
讓我們模擬實戰一回, 假定我們有個需求, 就是把重要的業務日誌資料, 匯入到表tb_record中.
create table `tb_record` (
`id` int(11) not null auto_increment,
`logs` varchar(128) not null,
primary key (`id`)
) engine=innodb default charset=utf8;
@insert("insert into tb_record(logs) values(#)")
int addrecord(@param("logs") string logs);}
在不改變**的前提下, 如何支援分表的無感知實現.
**編寫:
由於mybatis的***是全域性的, 因此這邊引入特定的註解用於區分目標/非目標物件(資料庫表).
定義分表策略介面和具體的實現類:
// 分表的策略類
public inte***ce itableshardstrategy
// 按天切分的分表策略類
public class datetableshardstrategy implements itableshardstrategy
}
定義註解:
@target(elementtype.type)
@retention(retentionpolicy.runtime)
public @inte***ce tableshard
編寫具體的mybatis***實現:
@intercepts(
)})public class tableshardinterceptor implements interceptor
// 傳遞給下乙個***處理
return invocation.proceed();
}@override
public object plugin(object target) else
}@override
public void setproperties(properties properties)
}
注: 不同mybatis的版本, 具體的api略有出入, 當前mybatis版本為(3.4.6).
配置plugin標籤, 注意要在mybatis-config.xml(mybatis全域性屬性配置檔案)中進行配置
測試:
@tableshard(tablename = "tb_record", shardstrategy = datetableshardstrategy.class)
@insert("insert into tb_record(logs) values(#)")
int addrecord(@param("logs") string logs);
}
編寫簡單的測試**:
@runwith(springjunit4classrunner.class)
@resource
@test
public void testaddrecord()
}
檢視資料庫進行資料驗證:
後記:
總的來說, mybatis的***給開發者很大的自由度, 像這邊的分表實踐是很好的例子. 但分表的策略有很多, 很多都是基於特定的維度進行雜湊, 總覺得在***中實現, 多少有些侵入性, 要做到無感透明, 其實還是挺難的.
分庫分表實戰問題
1.分庫分表中水平拆分和垂直拆分的區別?水平拆分 將表資料拆分到不同的資料資料庫中。垂直拆分 把乙個大表拆成多個小表。字段進行拆分。分表 是指的是把表資料拆分到多張表裡面。range分發 每個月生成乙個新錶。如果訪問新的資料還好,但是訪問舊的資料就麻煩一些。hash分發 平均分配,但是擴容的話會比較...
MyBatis實戰總結
前言 mybatis的前身是ibatis,它是乙個資料持久層框架。封裝優化了普通jdbc的過程,如資料庫連線的建立 設定sql語句引數 執行sql語句 事務 結果對映以及資源釋放等。mybatis是乙個支援普通sql查詢 儲存過程和高階對映的優秀持久層框架,使用簡單的xml或註解用於配置和原始對映,...
mysql 分庫分表實戰 MySQL分庫分表實戰
為什麼要分庫分表 在大型 中,當使用者量以及使用者產生的業務資料量達到單庫單錶效能極限時,為了支撐業務可持續發展,對於重要的核心業務必然要進行分庫分表來儲存業務資料。對於非核心業務產生的大量資料,例如爬蟲爬取的資訊,論壇產生的資料等,可以考慮把資料儲存在像mongodb這樣的nosql儲存裡面,這些...