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