天天看點

利用sharding-jdbc分庫分表

利用sharding-jdbc分庫分表
利用sharding-jdbc分庫分表

View Code

上面的配置,表示T_Order表按user_id進行分成ds_0,ds_1,ds_2共三庫,每個庫中又按order_id分成T_Order_0,T_Order_1二張表。

分庫、分表是按常見的取模算法處理的,需要使用者自定義二個類(基本上就是模闆代碼,不需要什麼改動)

SingleKeyModuloDatabaseShardingAlgorithm

利用sharding-jdbc分庫分表
利用sharding-jdbc分庫分表
利用sharding-jdbc分庫分表
利用sharding-jdbc分庫分表

然後mybatis裡就可以類似正常操作一樣來寫sql了,具體可參考源碼中的示例代碼。

不過,經個人測試發現一些小問題,以避免大家踩坑:

1、聚合函數的使用要特别小心,我試了下max/min/count這幾個函數,傳回時記得給傳回結果加字段别名,即: select count(*) order_count from t_order,否則可能傳回的結果不正确(已經向作者回報,估計很快會修複該bug)

2、另外分庫的key,不支援範圍搜尋,類似 select * from t_order where user_id > 100的操作,直接報錯,如果需要這樣的操作,建議先取max(user_id),比如最大使用者id為120,然後user_id in (101,102...120) 或者 between ... and 這樣處理。

3、如果采用druid資料源,目前有點不穩定,偶爾會出異常,建議采用dbcp(跟作者回報了下,說是很快會修複該問題)

4、批量插入問題,insert xxx values(...),(...),(...) 不支援,主要原因是因為要插入的記錄,無法定位分片。但是可以适當預處理下變通解決,思路:按db-key将List<T>中的對象先劃分成Map<dbkey,List<T>>,然後每個entry的List<T>再按tableKey做同樣的map映射,即:将List<T>變成Map<dbkey,Map<tableKey,List<T>> 這種結構,相當于人工把同一分片的資料整理到一起,再做insert批量插入就可以了。

其它一些使用上的限制,參考:

<a href="http://dangdangdotcom.github.io/sharding-jdbc/post/limitations/" target="_blank">http://dangdangdotcom.github.io/sharding-jdbc/post/limitations/</a>