ps:概念:
-
水平分库:是把同一个表的数据按一定规则拆到不同的数据库中,每个库可以放在不同的服务器 上。
-
水平分表:是在同一个数据库内,把同一个表的数据按一定规则拆到多个表中.
一、准备环境:
新增一个服务器节点,在两台服务器上都创建order_db库,并都创建t_order_1,t_order_2两张表。
二、对(一)Sharding-JDBC 整合mybatis-plus 水平分表代码改造
1.application.yml:
############################水平分库、分表#################################
#服务端口
server:port: 56081
#服务名
spring:application:name: sharding-jdbc-exampleshttp:encoding:enabled: truecharset: utf-8force: truemain:allow-bean-definition-overriding: true#shardingsphere相关配置shardingsphere:datasource:names: m1,m2 #配置库的名字,随意m1: #配置目前m1库的数据源信息type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.87.133:3306/order_db?useUnicode=trueusername: rootpassword: 123456m2:type: com.alibaba.druid.pool.DruidDataSourcedriverClassName: com.mysql.jdbc.Driverurl: jdbc:mysql://192.168.87.134:3306/order_db?useUnicode=trueusername: rootpassword: 123456sharding:tables:t_order:key-generator:column: user_idtype: SNOWFLAKEactual-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_idalgorithm‐expression: m$->{user_id % 2 + 1}table‐strategy: #分表策略inline:sharding‐column: order_idalgorithm‐expression: t_order_$->{order_id % 2 + 1}props:sql:show: true #打印sql#日志打印
logging:level:root: infoorg.springframework.web: infocom.lucifer.sharding.dao: debugdruid.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 {@ResourceOrderDao orderDao;@Testpublic 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);}}@Testpublic 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都查询一下;