【Sharding-JDBC】(三)整合mybatis-plus 水平分庫、分表

ps:概念:

  • 水平分庫:是把同一個表的數據按一定規則拆到不同的數據庫中,每個庫可以放在不同的服務器 上。

  • 水平分表:是在同一個數據庫內,把同一個表的數據按一定規則拆到多個表中.

一、準備環境:

新增一個服務器節點,在兩臺服務器上都創建order_db庫,並都創建t_order_1,t_order_2兩張表。

二、對(一)Sharding-JDBC 整合mybatis-plus 水平分表代碼改造

1.application.yml:

############################水平分庫、分表#################################
#服務端口
server:
  port: 56081
#服務名
spring:
  application:
    name: sharding-jdbc-examples
  http:
    encoding:
      enabled: true
      charset: utf-8
      force: true
  main:
    allow-bean-definition-overriding: true
  #shardingsphere相關配置
  shardingsphere:
    datasource:
      names: m1,m2   #配置庫的名字,隨意
      m1:   #配置目前m1庫的數據源信息
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.87.133:3306/order_db?useUnicode=true
        username: root
        password: 123456
      m2:
        type: com.alibaba.druid.pool.DruidDataSource
        driverClassName: com.mysql.jdbc.Driver
        url: jdbc:mysql://192.168.87.134:3306/order_db?useUnicode=true
        username: root
        password: 123456
    sharding:
      tables:
        t_order:
          key-generator:
            column: user_id
            type: SNOWFLAKE
          actual-data-nodes: m$->{1..2}.t_order_$->{1..2}   # 分庫策略,以user_id爲分片鍵,分片策略爲user_id % 2 + 1,user_id爲偶數操作m1數據源,否則操作m2。
          database‐strategy:  #分庫策略
            inline:
              sharding‐column: user_id
              algorithm‐expression: m$->{user_id % 2 + 1}
          table‐strategy: #分表策略
            inline:
              sharding‐column: order_id
              algorithm‐expression: t_order_$->{order_id % 2 + 1}
    props:
      sql:
        show: true   #打印sql


#日誌打印
logging:
  level:
    root: info
    org.springframework.web: info
    com.lucifer.sharding.dao: debug
    druid.sql: debug

ps:這裏的分庫分表策略:

分庫策略:以user_id爲分片鍵,分片策略爲user_id % 2 + 1,user_id爲偶數操作m1數據源,否則操作m2。
分表策略:以order_id爲分片鍵,分片策略爲{order_id % 2 + 1},order_id爲偶數操作t_order_1表,否則操作t_order_2表。

2.實體類:

package com.lucifer.sharding.pojo;

import java.io.Serializable;
import java.math.BigDecimal;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;

/**
 * @author Lucifer
 */
@TableName(value = "t_order")
@Data
public class Order implements Serializable {
    /**
     * 訂單id
     */
    @TableId(type=IdType.ID_WORKER)
    private Long orderId;

    /**
     * 訂單價格
     */
    private BigDecimal price;

    /**
     * 下單用戶id
     */
    private Long userId;

    /**
     * 訂單狀態
     */
    private String status;

    private static final long serialVersionUID = 1L;
}

這裏的改變,僅僅是在orderId這個屬性上加了mybatis-plus的雪花算法生成的id。

3.爲了簡單,此處不再使用controller和service寫接口用postman測試了,直接省略,直接在測試類中測試了。

4.測試類:

package com.lucifer.sharding;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.lucifer.sharding.dao.OrderDao;
import com.lucifer.sharding.pojo.Order;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;

import javax.annotation.Resource;
import java.math.BigDecimal;

@RunWith(SpringRunner.class)
@SpringBootTest(classes = {ShardingJdbcExamplesApplication.class})
public class ShardingJdbcExamplesApplicationTests {

    @Resource
    OrderDao orderDao;

    @Test
    public void add() {
        for (int i = 0; i < 10; i++) {
            Order order = new Order();
            order.setPrice(BigDecimal.valueOf(0.1));
            order.setStatus("0");
            orderDao.insert(order);
        }
    }
    
    @Test
    public void find() {
        QueryWrapper<Order> queryWrapper = new QueryWrapper<>();
        List<Long> list = new ArrayList<>();
        list.add(418766159777628160L); //庫1的t_order_2中
        list.add(418766159765045249L);  //庫2的t_order_1中
        queryWrapper.in("user_id",list);
        orderDao.selectList(queryWrapper);
    }

}

1.測試add

m1庫:(配置文件中配置的)====》192.168.87.133 

m2庫:(配置文件中配置的)====》192.168.87.134 

2.測試find

控制檯輸出,會去兩個庫中的t_order_1,t_order_2都查詢一下;

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章