feat: 读写分离

This commit is contained in:
胥员员 2022-11-08 15:30:22 +08:00
parent ca6e8eff22
commit 8b924446ed
6 changed files with 96 additions and 10 deletions

12
pom.xml
View File

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

View File

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

View File

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

View File

@ -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);
}
}

View File

@ -35,6 +35,11 @@ spring:
inline: inline:
sharding-column: user_id sharding-column: user_id
algorithm-expression: orders_${user_id % 8} algorithm-expression: orders_${user_id % 8}
# 读写分离配置,对应 YamlMasterSlaveRuleConfiguration 配置类
masterslave:
name: ms # 名字,任意,需要保证唯一
master-data-source-name: db0 # 主库数据源
slave-data-source-names: db1 # 从库数据源
# 拓展属性配置 # 拓展属性配置
props: props:
sql: sql:
@ -43,6 +48,14 @@ server:
port: 7529 port: 7529
servlet: servlet:
context-path: /api context-path: /api
mybatis: # mybatis-plus 配置内容
mapper-locations: classpath*:src/main/resources/mapper/*.xml mybatis-plus:
type-aliases-package: com.yupi.project.model.entity 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

View File

@ -2,6 +2,7 @@ package com.yupi.project.service;
import com.yupi.project.mapper.OrderMapper; import com.yupi.project.mapper.OrderMapper;
import com.yupi.project.model.entity.OrderDO; import com.yupi.project.model.entity.OrderDO;
import org.apache.shardingsphere.api.hint.HintManager;
import org.junit.Test; import org.junit.Test;
import org.junit.runner.RunWith; import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
@ -15,14 +16,39 @@ public class OrderMapperTest {
@Autowired @Autowired
private OrderMapper orderMapper; 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 @Test
public void testInsert() { public void testInsert() {
OrderDO order = new OrderDO(); OrderDO order = new OrderDO();
order.setId(2L); order.setUserId(3);
order.setUserId(4);
orderMapper.insert(order); orderMapper.insert(order);
} }
@Test
public void testGroup() {
orderService.add(new OrderDO().setUserId(10));
}
} }