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都查詢一下;