成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SpringBoot3分庫分表

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

一、簡介

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

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

垂直分片

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

水平分片

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

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

二、工程搭建

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

2、依賴管理

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

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

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

三、配置詳解

1、配置文件

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

spring:
  # 分庫分表配置
  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庫路由
            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庫路由算法
          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)庫,在操作不涉及需要路由的表時(shí)默認(rèn)使用該數(shù)據(jù)源,shard_db_0shard_db_1tb_order邏輯表的路由庫;

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

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

四、測試案例

1、主庫操作

基于Mybatis持久層框架,實(shí)現(xiàn)對(duì)shard_db默認(rèn)庫的數(shù)據(jù)操作,注意控制臺(tái)的日志打印,可以看到一系列解析邏輯以及庫表節(jié)點(diǎn)的定位,分頁查詢使用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("買家Three");
        System.out.println(buyerMapper.insert(buyer));
    }
    @Test
    public void testBuyerUpdate (){
        // 更新數(shù)據(jù)
        Buyer buyer = buyerMapper.selectByPrimaryKey(3) ;
        if (buyer != null){
            buyer.setBuyerName("Three買家");
            System.out.println(buyerMapper.updateByPrimaryKey(buyer));
        }
    }
    @Test
    public void testSellerPage (){
        // 1、設(shè)置分頁和查詢條件
        PageHelper.startPage(2,2) ;
        SellerExample sellerExample = new SellerExample() ;
        sellerExample.setOrderByClause("id asc");
        // 2、查詢數(shù)據(jù)
        List<Seller> sellerList = sellerMapper.selectByExample(sellerExample) ;
        // 3、構(gòu)建分頁實(shí)體對(duì)象
        PageInfo<Seller> pageInfo = new PageInfo<>(sellerList) ;
        System.out.println(pageInfo);
    }
}

2、分庫操作

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

public class ShardTest {
    @Autowired
    private OrderMapper orderMapper ;
    /**
     * 寫入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ù):買家和賣家ID都是2
            order.setBuyerId(1);
            order.setSellerId(3);
            orderMapper.updateByPrimaryKey(order) ;
        }
    }

    @Test
    public void testOrderPage (){
        // 1、設(shè)置分頁和查詢條件
        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)建分頁實(shí)體對(duì)象
        PageInfo<Order> pageInfo = new PageInfo<>(orderList) ;
        System.out.println(pageInfo);
    }
}

3、綜合查詢

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

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 =


責(zé)任編輯:武曉燕 來源: 知了一笑
相關(guān)推薦

2019-01-16 14:00:54

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

2019-11-12 09:54:20

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

2020-07-30 17:59:34

分庫分表SQL數(shù)據(jù)庫

2024-08-02 15:47:28

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

2018-06-01 14:00:00

數(shù)據(jù)庫MySQL分庫分表

2022-12-05 07:51:24

數(shù)據(jù)庫分庫分表讀寫分離

2019-03-06 14:42:01

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

2022-06-15 07:32:24

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

2021-04-01 05:40:53

分庫分表數(shù)據(jù)庫MySQL

2021-08-31 20:21:11

VitessMySQL分庫

2024-07-10 08:42:39

2020-07-28 09:04:09

NewSQL分庫分表

2021-01-26 05:37:08

分庫分表內(nèi)存

2022-07-11 08:16:47

NewSQL關(guān)系數(shù)據(jù)庫系統(tǒng)

2025-04-01 08:45:00

2024-07-26 00:16:11

2020-11-18 09:39:02

MySQL數(shù)據(jù)庫SQL

2024-12-04 13:02:34

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

2019-01-29 15:25:11

阿里巴巴數(shù)據(jù)庫分庫分表

2021-10-29 07:25:32

分庫分表技巧
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 欧美日韩三级 | 国产激情 | 91视频进入| 欧美精品一区在线发布 | 婷婷中文字幕 | 国产成人高清视频 | 91精品国产综合久久久动漫日韩 | 成人免费看片 | 精品一区二区三区在线观看国产 | 亚洲国产成人一区二区 | 亚洲视频国产视频 | 一区二区三区视频在线免费观看 | 精品欧美一区二区精品久久久 | 中文字幕免费在线观看 | 北条麻妃av一区二区三区 | 国产人成精品一区二区三 | 一区二区久久精品 | 99久久99| 91超碰在线 | 精品三区 | 亚洲一区二区三区四区在线观看 | 在线播放日韩 | 二区三区视频 | av无遮挡 | 欧美日韩综合精品 | 天天色影视综合 | 日韩综合网 | 做a视频在线观看 | 特a毛片| 午夜精品久久久久久久久久久久久 | 99日韩| 午夜欧美 | 成人美女免费网站视频 | 精品综合视频 | 国产欧美视频一区二区三区 | 国产伦精品一区二区三区精品视频 | 亚洲国产精品视频 | 日韩中出| 视频在线一区二区 | 成人在线视频网 | 一级黄色绿像片 |