Sharding-jdbc 分庫(kù)分表Springboot配置式

參考

yinjihuan 大佬的博客银舱,以及包含github的源代碼喇嘱,6的飛起
http://www.reibang.com/p/0e3905ae6ef2

數(shù)據(jù)分片(分庫(kù)和分表的Springboot版本 配置說明)
http://shardingsphere.io/document/current/cn/manual/sharding-jdbc/configuration/config-spring-boot/

Demo

基于User業(yè)務(wù)的分庫(kù)分表,按照sex字段進(jìn)行分庫(kù)吠卷,按照ID字段進(jìn)行分表王悍,純springboot 配置文件式的指定關(guān)系和策略
https://github.com/huangzhenshi/shardingJdbc-SpringBoot

數(shù)據(jù)庫(kù)分表的概述

  1. 數(shù)據(jù)庫(kù)分表的目的是提升Mysql查詢的效率,原理類似于數(shù)據(jù)庫(kù)的分區(qū)题画,把一個(gè)大表默辨,根據(jù)業(yè)務(wù)需求的特點(diǎn),拆分成若干個(gè)子表苍息,然后讀寫操作的時(shí)候缩幸,只要操作1個(gè)或者幾個(gè)相關(guān)的子表,而不是全表掃描竞思,從而大大提升查詢的效率表谊。同時(shí)也提升了寫的速度,因?yàn)閷懙臅r(shí)候(比如刪除或者修改)也需要先定位數(shù)據(jù)盖喷。
  2. 數(shù)據(jù)庫(kù)的分表可以不借助中間件爆办,直接通過編碼的形式實(shí)現(xiàn),例如Mybatis里面SQL课梳,根據(jù)業(yè)務(wù)特點(diǎn)拼子表的表名距辆,但是這種方式的缺點(diǎn)是編程復(fù)雜,而且不適用Hibernate和JPA惦界。
  3. 數(shù)據(jù)庫(kù)的分表最好是在一個(gè)數(shù)據(jù)庫(kù)里面挑格,避免了分布式事務(wù)的問題,不過理論上也是支持跨庫(kù)的分表
  4. 可以借助Sharding-Jdbc幫助實(shí)現(xiàn)數(shù)據(jù)庫(kù)的分表漂彤,通過預(yù)先配置表關(guān)系和實(shí)現(xiàn)接口設(shè)定數(shù)據(jù)分配規(guī)則,最終實(shí)現(xiàn)像操作一張表一樣灾搏,操作多個(gè)子表,實(shí)現(xiàn)了類似數(shù)據(jù)庫(kù)分區(qū)的效果狂窑。

配置方式

  1. 常規(guī)的pom.xml 依賴,只依賴一個(gè)jar包 sharding-jdbc-spring-boot-starter-2.0.0.M3.jar
  2. 表關(guān)系配置泉哈,多個(gè)子表指定一個(gè)邏輯表破讨,編程的時(shí)候,只要操作邏輯表即可奕纫,中間件封裝了復(fù)雜性
  3. 配置文件里面指定分表的邏輯,并且指定實(shí)現(xiàn)類匹层,實(shí)現(xiàn)分表邏輯
<dependency>
    <groupId>io.shardingjdbc</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>2.0.0.M3</version>
</dependency>


sharding.jdbc.datasource.names=ds_master

sharding.jdbc.datasource.ds_master.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds_master.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds_master.url=jdbc:mysql://localhost:3306/ds_master?characterEncoding=utf-8
sharding.jdbc.datasource.ds_master.username=root
sharding.jdbc.datasource.ds_master.password=123456

sharding.jdbc.config.sharding.tables.user.actual-data-nodes=ds_master.user_${0..3}
sharding.jdbc.config.sharding.tables.user.table-strategy.standard.sharding-column=id
sharding.jdbc.config.sharding.tables.user.table-strategy.standard.precise-algorithm-class-name=com.fangjia.sharding.MyPreciseShardingAlgorithm

public class MyPreciseShardingAlgorithm implements PreciseShardingAlgorithm<Long> {
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Long> shardingValue) {
        for (String tableName : availableTargetNames) {
            if (tableName.endsWith(shardingValue.getValue() % 4 + "")) {
                return tableName;
            }
        }
        throw new IllegalArgumentException();
    }
}
  1. 代碼編寫時(shí),和操作一張表一樣升筏,該怎么寫就怎么寫
    <insert id="addUser">
        INSERT INTO user (id, city, name ) VALUES (#{id},#{city},#{name})
    </insert>
   
    <select id="list" resultMap="baseResultMap">
        SELECT u.* FROM user u
    </select>
    
    <select id="findById" resultMap="baseResultMap">
        SELECT u.* FROM user u WHERE u.id=#{id,jdbcType=INTEGER}
    </select>

注意事項(xiàng)

使用分表分庫(kù)插入數(shù)據(jù)的時(shí)候,必須先手動(dòng)生成分片鍵(比如ID)您访,否則程序不知道該數(shù)據(jù)要插入到哪個(gè)數(shù)據(jù)庫(kù)的哪張表中。

數(shù)據(jù)庫(kù)分庫(kù)

分庫(kù)可以從物理層面上提升性能洋只,一般用于垂直分片辆沦,把不同的業(yè)務(wù)分在不同的數(shù)據(jù)庫(kù)上识虚,當(dāng)然也支持水平分片肢扯,例如我們的Demo,把User業(yè)務(wù)担锤,按照sex字段進(jìn)行分庫(kù)
分庫(kù)會(huì)引發(fā)分布式事務(wù)的問題

  1. 配置參考下面的蔚晨,根據(jù)sex字段來進(jìn)行分庫(kù),sex是奇數(shù)進(jìn) ds_1庫(kù)肛循,偶數(shù)進(jìn)ds_0庫(kù)
sharding.jdbc.datasource.names=ds_0,ds_1

sharding.jdbc.datasource.ds_0.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds_0.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds_0.url=jdbc:mysql://localhost:3306/ds_0?characterEncoding=utf-8
sharding.jdbc.datasource.ds_0.username=root
sharding.jdbc.datasource.ds_0.password=123456

sharding.jdbc.datasource.ds_1.type=com.alibaba.druid.pool.DruidDataSource
sharding.jdbc.datasource.ds_1.driver-class-name=com.mysql.jdbc.Driver
sharding.jdbc.datasource.ds_1.url=jdbc:mysql://localhost:3306/ds_1?characterEncoding=utf-8
sharding.jdbc.datasource.ds_1.username=root
sharding.jdbc.datasource.ds_1.password=123456

sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=sex
sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=ds_${sex % 2}
  1. 插入的時(shí)候铭腕,記得要先指定好 sex字段值
    for (long i = 0; i < 100; i++) {
        User user = new User();
        user.setId(i);
        user.setCity("蘇州");
        user.setName("小燕兒female");
        user.setSex(1);
        userService.add(user);
    }
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市多糠,隨后出現(xiàn)的幾起案子累舷,更是在濱河造成了極大的恐慌,老刑警劉巖夹孔,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件被盈,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡搭伤,警方通過查閱死者的電腦和手機(jī)只怎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來怜俐,“玉大人身堡,你說我怎么就攤上這事∨睦穑” “怎么了贴谎?”我有些...
    開封第一講書人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵汞扎,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我擅这,道長(zhǎng)佩捞,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任蕾哟,我火速辦了婚禮,結(jié)果婚禮上莲蜘,老公的妹妹穿的比我還像新娘谭确。我一直安慰自己,他們只是感情好票渠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開白布逐哈。 她就那樣靜靜地躺著,像睡著了一般问顷。 火紅的嫁衣襯著肌膚如雪昂秃。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,562評(píng)論 1 305
  • 那天杜窄,我揣著相機(jī)與錄音肠骆,去河邊找鬼。 笑死塞耕,一個(gè)胖子當(dāng)著我的面吹牛蚀腿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播扫外,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼筛谚,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了驾讲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤厚柳,失蹤者是張志新(化名)和其女友劉穎沐兵,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扎谎,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年胧奔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胳泉。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡岩遗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宿礁,到底是詐尸還是另有隱情,我是刑警寧澤控汉,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布返吻,位于F島的核電站,受9級(jí)特大地震影響测僵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜恨课,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一剂公、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧纲辽,春花似錦、人聲如沸拖吼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至移怯,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舟误,已是汗流浹背姻乓。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留堵腹,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像禁偎,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子如暖,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

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