国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SpringBoot3分庫(kù)分表

這篇具有很好參考價(jià)值的文章主要介紹了SpringBoot3分庫(kù)分表。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

標(biāo)簽:ShardingSphere5.分庫(kù).分表;

一、簡(jiǎn)介

分庫(kù)分表的設(shè)計(jì)和實(shí)現(xiàn)方式,在之前的內(nèi)容中總結(jié)過(guò)很多,本文基于SpringBoot3ShardingSphere5框架實(shí)現(xiàn)數(shù)據(jù)分庫(kù)分表的能力;

不得不提ShardingSphere5文檔中描述的兩個(gè)基本概念:

SpringBoot3分庫(kù)分表

垂直分片

按照業(yè)務(wù)拆分的方式稱為垂直分片,又稱為縱向拆分,它的核心理念是專庫(kù)專用。在拆分之前,一個(gè)數(shù)據(jù)庫(kù)由多個(gè)數(shù)據(jù)表構(gòu)成,每個(gè)表對(duì)應(yīng)著不同的業(yè)務(wù)。而拆分之后,則是按照業(yè)務(wù)將表進(jìn)行歸類,分布到不同的數(shù)據(jù)庫(kù)中,從而將壓力分散至不同的數(shù)據(jù)庫(kù)。

水平分片

水平分片又稱為橫向拆分。 相對(duì)于垂直分片,它不再將數(shù)據(jù)根據(jù)業(yè)務(wù)邏輯分類,而是通過(guò)某個(gè)字段(或某幾個(gè)字段),根據(jù)某種規(guī)則將數(shù)據(jù)分散至多個(gè)庫(kù)或表中,每個(gè)分片僅包含數(shù)據(jù)的一部分。

下面從案例實(shí)踐中,看看ShardingSphere5框架是如何實(shí)現(xiàn)分庫(kù)分表的原理;

二、工程搭建

1、工程結(jié)構(gòu)

SpringBoot3分庫(kù)分表

2、依賴管理

這里只看兩個(gè)核心組件的依賴:shardingsphere-jdbc組件是5.2.1版本,mybatis組件是3.5.13版本,在依賴管理中還涉及MySQL和分頁(yè)等,并且需要添加很多排除配置,具體見(jiàn)源碼;

<!-- Mybatis組件 -->
<dependency>
    <groupId>org.mybatis.spring.boot</groupId>
    <artifactId>mybatis-spring-boot-starter</artifactId>
    <version>${mybatis.version}</version>
</dependency>

<!-- ShardingSphere分庫(kù)分表 -->
<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core-spring-boot-starter</artifactId>
    <version>${shardingsphere.version}</version>
</dependency>

三、配置詳解

1、配置文件

此處只展示分庫(kù)分表的相關(guān)配值,默認(rèn)數(shù)據(jù)源使用db_master庫(kù),注意tb_order庫(kù)表路由的策略和分片算法的關(guān)聯(lián)關(guān)系,其他工程配置詳見(jiàn)源碼倉(cāng)庫(kù);

spring:
  # 分庫(kù)分表配置
  shardingsphere:
    datasource:
      # 默認(rèn)數(shù)據(jù)源
      sharding:
        default-data-source-name: db_master
      names: db_master,db_0,db_1
      db_master:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/shard_db
        username: root
        password: 123456
      db_0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/shard_db_0
        username: root
        password: 123456
      db_1:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/shard_db_1
        username: root
        password: 123456
    rules:
      sharding:
        tables:
          # tb_order邏輯
          tb_order:
            actual-data-nodes: db_${0..1}.tb_order_${0..2}
            # tb_order庫(kù)路由
            database-strategy:
              standard:
                sharding-column: order_id
                sharding-algorithm-name: database_inline
            # tb_order表路由
            table-strategy:
              standard:
                sharding-column: order_id
                sharding-algorithm-name: table_inline
        sharding-algorithms:
          # tb_order庫(kù)路由算法
          database_inline:
            type: INLINE
            props:
              algorithm-expression: db_${order_id % 2}
          # tb_order表路由算法
          table_inline:
            type: INLINE
            props:
              algorithm-expression: tb_order_${order_id % 3}
    props:
      sql-show: true
      sql-comment-parse-enabled: true

2、配置原理

在配置中需要管理三個(gè)數(shù)據(jù)源,shard_db默認(rèn)庫(kù),在操作不涉及需要路由的表時(shí)默認(rèn)使用該數(shù)據(jù)源,shard_db_0shard_db_1tb_order邏輯表的路由庫(kù);

SpringBoot3分庫(kù)分表

邏輯表tb_order整體使用兩個(gè)數(shù)據(jù)庫(kù),每個(gè)庫(kù)建3張結(jié)構(gòu)相同相同的表,在操作tb_order數(shù)據(jù)時(shí),會(huì)根據(jù)order_id字段值定位數(shù)據(jù)所屬的分片節(jié)點(diǎn);

  • 庫(kù)路由db_${0..1}采用db_${order_id%2}的算法;
  • 表路由tb_order_${0..2}采用tb_order_${order_id%3}的算法;

四、測(cè)試案例

1、主庫(kù)操作

基于Mybatis持久層框架,實(shí)現(xiàn)對(duì)shard_db默認(rèn)庫(kù)的數(shù)據(jù)操作,注意控制臺(tái)的日志打印,可以看到一系列解析邏輯以及庫(kù)表節(jié)點(diǎn)的定位,分頁(yè)查詢使用PageHelper組件即可;

public class MasterTest {
    @Autowired
    private BuyerMapper buyerMapper ;
    @Autowired
    private SellerMapper sellerMapper ;
    @Test
    public void testBuyerQuery (){
        // 主鍵查詢
        Buyer buyer = buyerMapper.selectByPrimaryKey(1) ;
        System.out.println(buyer.getId()+";"+buyer.getBuyerName());
    }
    @Test
    public void testBuyerInsert (){
        // 新增數(shù)據(jù)
        Buyer buyer = new Buyer() ;
        buyer.setBuyerName("買(mǎi)家Three");
        System.out.println(buyerMapper.insert(buyer));
    }
    @Test
    public void testBuyerUpdate (){
        // 更新數(shù)據(jù)
        Buyer buyer = buyerMapper.selectByPrimaryKey(3) ;
        if (buyer != null){
            buyer.setBuyerName("Three買(mǎi)家");
            System.out.println(buyerMapper.updateByPrimaryKey(buyer));
        }
    }
    @Test
    public void testSellerPage (){
        // 1、設(shè)置分頁(yè)和查詢條件
        PageHelper.startPage(2,2) ;
        SellerExample sellerExample = new SellerExample() ;
        sellerExample.setOrderByClause("id asc");
        // 2、查詢數(shù)據(jù)
        List<Seller> sellerList = sellerMapper.selectByExample(sellerExample) ;
        // 3、構(gòu)建分頁(yè)實(shí)體對(duì)象
        PageInfo<Seller> pageInfo = new PageInfo<>(sellerList) ;
        System.out.println(pageInfo);
    }
}

2、分庫(kù)操作

在對(duì)tb_order表執(zhí)行增刪改查時(shí),會(huì)根據(jù)order_id的字段值計(jì)算庫(kù)表的路由節(jié)點(diǎn),注意分頁(yè)時(shí)會(huì)查詢所有的分庫(kù)和分表,然后匯總查詢的結(jié)果;

public class ShardTest {
    @Autowired
    private OrderMapper orderMapper ;
    /**
     * 寫(xiě)入100條數(shù)據(jù)
     */
    @Test
    public void testOrderInsert (){
        for (int i=1 ; i<= 100 ; i++){
            Order order = new Order(i,i%3+1,i%3+1) ;
            // orderMapper.insert(order) ;
        }
    }
    @Test
    public void testOrderQuery (){
        Order order = orderMapper.selectByPrimaryKey(5) ;
        System.out.println(order);
    }
    @Test
    public void testOrderUpdate (){
        Order order = orderMapper.selectByPrimaryKey(100) ;
        if (order != null){
            // 原數(shù)據(jù):買(mǎi)家和賣(mài)家ID都是2
            order.setBuyerId(1);
            order.setSellerId(3);
            orderMapper.updateByPrimaryKey(order) ;
        }
    }

    @Test
    public void testOrderPage (){
        // 1、設(shè)置分頁(yè)和查詢條件
        PageHelper.startPage(1,10) ;
        OrderExample orderExample = new OrderExample() ;
        orderExample.createCriteria().andBuyerIdEqualTo(2).andSellerIdEqualTo(2);
        orderExample.setOrderByClause("order_id desc");
        // 2、查詢數(shù)據(jù)
        List<Order> orderList = orderMapper.selectByExample(orderExample) ;
        // 3、構(gòu)建分頁(yè)實(shí)體對(duì)象
        PageInfo<Order> pageInfo = new PageInfo<>(orderList) ;
        System.out.println(pageInfo);
    }
}

3、綜合查詢

編寫(xiě)一個(gè)訂單詳情查詢接口,同時(shí)使用三個(gè)庫(kù)構(gòu)建數(shù)據(jù)結(jié)構(gòu);如果是基于列表數(shù)據(jù)的檢索,比較常規(guī)做法的是構(gòu)建ES索引結(jié)構(gòu),如果沒(méi)有搜索的需求,可以在訂單表分頁(yè)查詢后去拼接其他結(jié)構(gòu);

@RestController
public class OrderController {

    @Resource
    private BuyerMapper buyerMapper ;
    @Resource
    private SellerMapper sellerMapper ;
    @Resource
    private OrderMapper orderMapper ;

    /**
     * 查詢訂單詳情
     */
    @GetMapping("/order/info/{orderId}")
    public Map<String,Object> orderInfo (@PathVariable Integer orderId){
        Map<String,Object> orderMap = new HashMap<>() ;
        Order order = orderMapper.selectByPrimaryKey(orderId) ;
        if (order != null){
            orderMap.put("order",order) ;
            orderMap.put("buyer",buyerMapper.selectByPrimaryKey(order.getBuyerId())) ;
            orderMap.put("seller",sellerMapper.selectByPrimaryKey(order.getSellerId())) ;
        }
        return orderMap ;
    }
}

查看SQL語(yǔ)句文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-639449.html

db_master ::: select id, buyer_name from tb_buyer where id = ? ::: [1]
db_master ::: select id, seller_name from tb_seller where id = ? ::: [3]
db_0 ::: select order_id, seller_id, buyer_id from tb_order_1 where order_id = ? ::: [100]

五、參考源碼

文檔倉(cāng)庫(kù):
https://gitee.com/cicadasmile/butte-java-note

源碼倉(cāng)庫(kù):
https://gitee.com/cicadasmile/butte-spring-parent

到了這里,關(guān)于SpringBoot3分庫(kù)分表的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • SpringBoot整合ShardingSphere-JDBC 5.3.2 實(shí)現(xiàn)讀寫(xiě)分離、分庫(kù)分表。

    SpringBoot整合ShardingSphere-JDBC 5.3.2 實(shí)現(xiàn)讀寫(xiě)分離、分庫(kù)分表。

    ???????個(gè)人主頁(yè):阿木木AEcru ?? 系列專欄:《Docker容器化部署系列》 《Java每日面筋》 ??每一次技術(shù)突破,都是對(duì)自我能力的挑戰(zhàn)和超越。 Docker部署MYSQL主從詳細(xì)教程-阿木木AEcru-CSDN 那天寫(xiě)了 部署mysql主從后,想了想,還是有必要出多一篇關(guān)于ShardingSphere-JDBC 讀寫(xiě)分離

    2024年04月13日
    瀏覽(17)
  • 【分庫(kù)分表】基于mysql+shardingSphere的分庫(kù)分表技術(shù)

    【分庫(kù)分表】基于mysql+shardingSphere的分庫(kù)分表技術(shù)

    目錄 1.什么是分庫(kù)分表 2.分片方法 3.測(cè)試數(shù)據(jù) 4.shardingSphere 4.1.介紹 4.2.sharding jdbc 4.3.sharding proxy 4.4.兩者之間的對(duì)比 5.留個(gè)尾巴 分庫(kù)分表是一種場(chǎng)景解決方案,它的出現(xiàn)是為了解決一些場(chǎng)景問(wèn)題的,哪些場(chǎng)景喃? 單表過(guò)大的話,讀請(qǐng)求進(jìn)來(lái),查數(shù)據(jù)需要的時(shí)間會(huì)過(guò)長(zhǎng) 讀請(qǐng)求過(guò)

    2024年03月12日
    瀏覽(46)
  • 分表?分庫(kù)?分庫(kù)分表?實(shí)踐詳談 ShardingSphere-JDBC

    分表?分庫(kù)?分庫(kù)分表?實(shí)踐詳談 ShardingSphere-JDBC

    如果有不是很了解ShardingSphere的可以先看一下這個(gè)文章: 《ShardingSphere JDBC?Sharding JDBC?》基本小白脫坑問(wèn)題 ? ? ? ? 在很多開(kāi)發(fā)場(chǎng)景下面,很多的技術(shù)難題都是出自于,大數(shù)據(jù)量級(jí)或者并發(fā)的場(chǎng)景下面的。這里就出現(xiàn)了我們要解決的。本文章重點(diǎn)討論一下在java的spirng開(kāi)發(fā)場(chǎng)

    2024年04月12日
    瀏覽(23)
  • ShardingSphere-JDBC 分庫(kù)分表

    springBoot? 引入maven application.yml配置 table-strategy:指定表的分片策略,table-strategy有以下幾種策略 1 ) none 表示不分片,所有數(shù)據(jù)都存儲(chǔ)在同一個(gè)表中。 2 ) standard 表示使用標(biāo)準(zhǔn)分片策略,根據(jù)分片鍵的值進(jìn)行范圍匹配,將數(shù)據(jù)路由到對(duì)應(yīng)的分片表中。 ? ? ? ? 對(duì)應(yīng)StandardShardi

    2024年01月19日
    瀏覽(22)
  • Java微服務(wù)分布式分庫(kù)分表ShardingSphere - ShardingSphere-JDBC

    Java微服務(wù)分布式分庫(kù)分表ShardingSphere - ShardingSphere-JDBC

    ??作者主頁(yè):青花鎖 ??簡(jiǎn)介:Java領(lǐng)域優(yōu)質(zhì)創(chuàng)作者??、Java微服務(wù)架構(gòu)公號(hào)作者?? ??簡(jiǎn)歷模板、學(xué)習(xí)資料、面試題庫(kù)、技術(shù)互助 ??文末獲取聯(lián)系方式 ?? 專欄 描述 Java項(xiàng)目實(shí)戰(zhàn) 介紹Java組件安裝、使用;手寫(xiě)框架等 Aws服務(wù)器實(shí)戰(zhàn) Aws Linux服務(wù)器上操作nginx、git、JDK、Vue Jav

    2024年03月26日
    瀏覽(66)
  • shardingsphere-proxy 實(shí)現(xiàn)postgresql的分庫(kù)分表

    shardingsphere-proxy 實(shí)現(xiàn)postgresql的分庫(kù)分表

    1、拉取鏡像 2、運(yùn)行容器 3、查看容器是不是運(yùn)行成功 1、獲取鏡像中的配置 2、啟動(dòng)shardingsphere-proxy 3、檢查shardingsphere-proxy是否啟動(dòng)成功 1、拉取鏡像 2、運(yùn)行鏡像 3、進(jìn)入docker容器檢查是否成功 4、創(chuàng)建查詢用戶,并賦值權(quán)限 修改server.xml文件,文件地址:/home/sunyuhua/docker/s

    2024年02月11日
    瀏覽(21)
  • shardingsphere5.x整合springboot+dynamic-datasource多數(shù)據(jù)源實(shí)戰(zhàn)

    本文是在springboot整合分庫(kù)分表的基礎(chǔ)上添加了多數(shù)據(jù)源,建議先看上一篇shardingsphere5.x整合springboot分庫(kù)分表實(shí)戰(zhàn)_任人人人呢的博客-CSDN博客 pom.xml配置: yml配置: 添加多數(shù)據(jù)源配置類: 添加多數(shù)據(jù)源常量類: Mapper文件

    2024年02月13日
    瀏覽(23)
  • ShardingSphere5入門(mén)到實(shí)戰(zhàn)

    ShardingSphere5入門(mén)到實(shí)戰(zhàn) 互聯(lián)網(wǎng)業(yè)務(wù)興起之后,海量用戶加上海量數(shù)據(jù)的特點(diǎn),單個(gè)數(shù)據(jù)庫(kù)服務(wù)器已經(jīng)難以滿足業(yè)務(wù)需要,必須考慮數(shù)據(jù)庫(kù)集群的方式來(lái)提升性能。高性能數(shù)據(jù)庫(kù)集群的 第一種方式是“讀寫(xiě)分離” , 第二種方式是“數(shù)據(jù)庫(kù)分片” 。 讀寫(xiě)分離原理: 讀寫(xiě)分離的

    2024年02月11日
    瀏覽(16)
  • springboot~sharding-jdbc實(shí)現(xiàn)分庫(kù)分表

    springboot~sharding-jdbc實(shí)現(xiàn)分庫(kù)分表

    當(dāng)mysql數(shù)據(jù)庫(kù)單表大于1千萬(wàn)以后,查詢的性能就不能保證了,我們必須考慮分庫(kù),分表的方案了,還好,sharding-jdbc可以很優(yōu)雅的與springboot對(duì)接,完成對(duì)mysql的分庫(kù)和分表。 為了不影響其它小容量的表,所有添加了動(dòng)態(tài)數(shù)據(jù)源,只對(duì)需要分庫(kù)分表的進(jìn)行配置即可 com.baomidou:dy

    2024年02月06日
    瀏覽(16)
  • springboot~對(duì)應(yīng)sharding-jdbc實(shí)現(xiàn)分庫(kù)分表

    springboot~對(duì)應(yīng)sharding-jdbc實(shí)現(xiàn)分庫(kù)分表

    當(dāng)mysql數(shù)據(jù)庫(kù)單表大于1千萬(wàn)以后,查詢的性能就不能保證了,我們必須考慮分庫(kù),分表的方案了,還好,sharding-jdbc可以很優(yōu)雅的與springboot對(duì)接,完成對(duì)mysql的分庫(kù)和分表。 為了不影響其它小容量的表,所有添加了動(dòng)態(tài)數(shù)據(jù)源,只對(duì)需要分庫(kù)分表的進(jìn)行配置即可 com.baomidou:dy

    2024年02月06日
    瀏覽(16)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包