shardindjdbc-complex策略

支持多分片鍵的復(fù)雜分片策略。
配置參數(shù):complex.sharding-columns 分片鍵(多個);
complex.algorithm-class-name 分片算法實現(xiàn)類架谎。
sql和源碼
https://gitee.com/zhangjijige/shardingjdbc.git
配置

spring:
  main:
    allow-bean-definition-overriding: true
  shardingsphere:
    # 參數(shù)配置诸狭,顯示 sql
    props:
      sql:
        show: true
    # 配置數(shù)據(jù)源
    datasource:
      # 數(shù)據(jù)源別名
      names: db0, db1, db2, db3
      # db1數(shù)據(jù)源信息
      db0:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/order_db_0?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
        username: root
        password: root
      db1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/order_db_1?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
        username: root
        password: root
      db2:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/order_db_2?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
        username: root
        password: root
      db3:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://127.0.0.1:3306/order_db_3?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT
        username: root
        password: root
    sharding:
      tables:
        # 邏輯表名
        tbl_order:
          # 指定數(shù)據(jù)節(jié)點
          actual-data-nodes: db$->{0..3}.tbl_order_$->{0..3}
          # 分庫策略
          database-strategy:
            standard:
              sharding-column: user_id
              precise-algorithm-class-name: com.example.shardingjdbc.sharding.algorithm.DBPreciseShardingAlgorithm
          # 分表策略
          table-strategy:
            complex:
              sharding-columns: order_id,user_id
              # 復(fù)合分表分片配置類
              algorithm-class-name: com.example.shardingjdbc.sharding.algorithm.MyComplexShardingAlgorithm
mybatis:
  mapper-locations: classpath:mapper/*.xml

策略類

public class MyComplexShardingAlgorithm implements ComplexKeysShardingAlgorithm<Long> {
    private final static String ORDER_ID = "order_id";
    private final static String USER_ID = "user_id";

    @Override
    public Collection<String> doSharding(Collection<String> availableTargetNames,
                                         ComplexKeysShardingValue<Long> shardingValue) {

        Collection<Long> orderIds = getShardingValue(shardingValue, ORDER_ID);
        Collection<Long> userIds = getShardingValue(shardingValue, USER_ID);

        Set<String> tables = new HashSet<>();
        for (Long userId : userIds) {
            for (Long orderId : orderIds) {
                int index = getIndex(userId, orderId, availableTargetNames);
                for (String tableName: availableTargetNames) {
                    if (tableName.endsWith(String.valueOf(index))) {
                        tables.add(tableName);
                    }
                }
            }
        }

        return tables;
    }

    private Collection<Long> getShardingValue(ComplexKeysShardingValue shardingValue, String key) {
        Collection<Long> valueList = new ArrayList<>();
        Map<String, Collection<Long>> columnNameAndShardingValuesMap =
                shardingValue.getColumnNameAndShardingValuesMap();
        if (columnNameAndShardingValuesMap.containsKey(key)) {
            valueList.addAll(columnNameAndShardingValuesMap.get(key));
        }

        return valueList;
    }

    private int getIndex(Long userId, Long orderId, Collection<String> availableTargetNames) {
        String userIdStr = String.valueOf(userId);
        String orderIdStr = String.valueOf(orderId);
        int sum = Integer.parseInt(userIdStr.substring(userIdStr.length() - 1)) + Integer.parseInt(orderIdStr.substring(orderIdStr.length() - 1));
        return sum % availableTargetNames.size();
    }
}

doSharding方法的入?yún)?/p>

image.png

會有疑問doSharding方法中的入?yún)hardingValue是如何獲取數(shù)據(jù)的
這個涉及到源碼,主要是mybatis組裝sql后,shardingjdbc會解析sql,并結(jié)合分片建獲取分片建的數(shù)據(jù),具體可以看源碼方法
org.apache.shardingsphere.core.route.router.sharding.ParsingSQLRouter#route
方法中的
OptimizeResult optimizeResult = OptimizeEngineFactory.newInstance(shardingRule, sqlStatement, parameters, generatedKey.orNull()).optimize();

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末券膀,一起剝皮案震驚了整個濱河市君纫,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌芹彬,老刑警劉巖蓄髓,帶你破解...
    沈念sama閱讀 216,402評論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異舒帮,居然都是意外死亡会喝,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評論 3 392
  • 文/潘曉璐 我一進(jìn)店門会前,熙熙樓的掌柜王于貴愁眉苦臉地迎上來好乐,“玉大人,你說我怎么就攤上這事瓦宜∥低颍” “怎么了?”我有些...
    開封第一講書人閱讀 162,483評論 0 353
  • 文/不壞的土叔 我叫張陵临庇,是天一觀的道長反璃。 經(jīng)常有香客問我,道長假夺,這世上最難降的妖魔是什么淮蜈? 我笑而不...
    開封第一講書人閱讀 58,165評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮已卷,結(jié)果婚禮上梧田,老公的妹妹穿的比我還像新娘。我一直安慰自己侧蘸,他們只是感情好裁眯,可當(dāng)我...
    茶點故事閱讀 67,176評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著讳癌,像睡著了一般穿稳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上晌坤,一...
    開封第一講書人閱讀 51,146評論 1 297
  • 那天逢艘,我揣著相機(jī)與錄音,去河邊找鬼骤菠。 笑死它改,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的商乎。 我是一名探鬼主播搔课,決...
    沈念sama閱讀 40,032評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了爬泥?” 一聲冷哼從身側(cè)響起柬讨,我...
    開封第一講書人閱讀 38,896評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎袍啡,沒想到半個月后踩官,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡境输,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,536評論 2 332
  • 正文 我和宋清朗相戀三年蔗牡,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗅剖。...
    茶點故事閱讀 39,696評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡辩越,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出信粮,到底是詐尸還是另有隱情黔攒,我是刑警寧澤,帶...
    沈念sama閱讀 35,413評論 5 343
  • 正文 年R本政府宣布强缘,位于F島的核電站督惰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏旅掂。R本人自食惡果不足惜赏胚,卻給世界環(huán)境...
    茶點故事閱讀 41,008評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望商虐。 院中可真熱鬧觉阅,春花似錦、人聲如沸秘车。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽鲫尊。三九已至痴柔,卻和暖如春沦偎,著一層夾襖步出監(jiān)牢的瞬間疫向,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,815評論 1 269
  • 我被黑心中介騙來泰國打工豪嚎, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留搔驼,地道東北人。 一個月前我還...
    沈念sama閱讀 47,698評論 2 368
  • 正文 我出身青樓侈询,卻偏偏與公主長得像舌涨,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子扔字,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,592評論 2 353

推薦閱讀更多精彩內(nèi)容