feat: 读写分离

分库分表
胥员员 2 years ago
parent ca6e8eff22
commit 8b924446ed

@ -28,10 +28,16 @@
<artifactId>spring-boot-starter-aop</artifactId>
</dependency>
<!-- 实现对 MyBatis 的自动化配置 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.1.1</version>
<!-- <dependency>-->
<!-- <groupId>org.mybatis.spring.boot</groupId>-->
<!-- <artifactId>mybatis-spring-boot-starter</artifactId>-->
<!-- <version>2.1.1</version>-->
<!-- </dependency>-->
<!-- 实现对 MyBatis Plus 的自动化配置 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<!-- https://mvnrepository.com/artifact/com.google.code.gson/gson -->

@ -1,12 +1,13 @@
package com.yupi.project.mapper;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.yupi.project.model.entity.OrderDO;
import org.apache.ibatis.annotations.Mapper;
@Mapper
public interface OrderMapper {
public interface OrderMapper extends BaseMapper<OrderDO> {
void insert(OrderDO order);
// void insert(OrderDO order);
}

@ -1,6 +1,8 @@
package com.yupi.project.model.entity;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.experimental.Accessors;
import java.io.Serializable;
@ -9,6 +11,8 @@ import java.io.Serializable;
* @author Administrator
*/
@Data
@TableName(value = "orders")
@Accessors(chain = true)
public class OrderDO implements Serializable {
/**

@ -0,0 +1,36 @@
package com.yupi.project.service;
import com.yupi.project.mapper.OrderMapper;
import com.yupi.project.model.entity.OrderDO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
/**
* @author Administrator
*/
@Service
public class OrderService {
@Autowired
private OrderMapper orderMapper;
@Transactional
public void add(OrderDO order) {
// <1.1> 这里先假模假样的读取一下。读取从库
OrderDO exists = orderMapper.selectById(1);
System.out.println(exists);
// <1.2> 插入订单
orderMapper.insert(order);
// <1.3> 这里先假模假样的读取一下。读取主库
exists = orderMapper.selectById(1);
System.out.println(exists);
}
public OrderDO findById(Integer id) {
return orderMapper.selectById(id);
}
}

@ -35,6 +35,11 @@ spring:
inline:
sharding-column: user_id
algorithm-expression: orders_${user_id % 8}
# 读写分离配置,对应 YamlMasterSlaveRuleConfiguration 配置类
masterslave:
name: ms # 名字,任意,需要保证唯一
master-data-source-name: db0 # 主库数据源
slave-data-source-names: db1 # 从库数据源
# 拓展属性配置
props:
sql:
@ -43,6 +48,14 @@ server:
port: 7529
servlet:
context-path: /api
mybatis:
mapper-locations: classpath*:src/main/resources/mapper/*.xml
type-aliases-package: com.yupi.project.model.entity
# mybatis-plus 配置内容
mybatis-plus:
configuration:
map-underscore-to-camel-case: true # 虽然默认为 true ,但是还是显示去指定下。
global-config:
db-config:
id-type: none # 虽然 MyBatis Plus 也提供 ID 生成策略,但是还是使用 Sharding-JDBC 的
logic-delete-value: 1 # 逻辑已删除值(默认为 1)
logic-not-delete-value: 0 # 逻辑未删除值(默认为 0)
mapper-locations: classpath*:mapper/*.xml
type-aliases-package: com.yupi.project.model.entity

@ -2,6 +2,7 @@ package com.yupi.project.service;
import com.yupi.project.mapper.OrderMapper;
import com.yupi.project.model.entity.OrderDO;
import org.apache.shardingsphere.api.hint.HintManager;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
@ -15,14 +16,39 @@ public class OrderMapperTest {
@Autowired
private OrderMapper orderMapper;
@Autowired
private OrderService orderService;
@Test
public void testSelectById() { // 测试从库的负载均衡
for (int i = 0; i < 2; i++) {
OrderDO order = orderMapper.selectById(1);
System.out.println(order);
}
}
@Test
public void testSelectById02() { // 测试强制访问主库
try (HintManager hintManager = HintManager.getInstance()) {
// 设置强制访问主库
hintManager.setMasterRouteOnly();
// 执行查询
OrderDO order = orderMapper.selectById(1);
System.out.println(order);
}
}
@Test
public void testInsert() {
OrderDO order = new OrderDO();
order.setId(2L);
order.setUserId(4);
order.setUserId(3);
orderMapper.insert(order);
}
@Test
public void testGroup() {
orderService.add(new OrderDO().setUserId(10));
}
}
Loading…
Cancel
Save