Mybatis的分表實戰

2021-09-08 14:09:56 字數 2658 閱讀 8116

前言:

以前寫**, 關於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儲存裡面,這些...