yudao-cloud数据库设计:MySQL+MyBatis Plus多数据源与读写分离
概述
在现代企业级应用中,数据库的性能和可用性是系统架构设计的核心考量。yudao-cloud作为一款基于Spring Cloud Alibaba的企业级后台管理系统,采用了MySQL作为主要数据库,并集成了MyBatis Plus框架,通过多数据源和读写分离技术来提升系统的数据处理能力和高可用性。
本文将深入解析yudao-cloud的数据库架构设计,重点介绍其多数据源配置、读写分离实现原理以及在实际业务场景中的应用实践。
技术架构概览
核心组件依赖
yudao-cloud的多数据源架构基于以下核心技术栈:
主要技术特性
| 特性 | 实现方式 | 优势 |
|---|---|---|
| 多数据源 | Dynamic Datasource Starter | 灵活的数据源配置和管理 |
| 读写分离 | 注解驱动 | 自动路由,业务无感知 |
| 事务管理 | @DSTransactional | 跨数据源事务一致性 |
| 连接池 | Druid | 高性能连接管理 |
多数据源配置详解
数据源枚举定义
yudao-cloud通过DataSourceEnum接口定义了标准的数据源标识:
public interface DataSourceEnum {
/**
* 主库,推荐使用 @Master 注解
*/
String MASTER = "master";
/**
* 从库,推荐使用 @Slave 注解
*/
String SLAVE = "slave";
}
配置文件结构
在application.yml中,多数据源的配置采用以下结构:
spring:
datasource:
dynamic:
primary: master # 设置默认的数据源
strict: false # 严格匹配数据源,默认false
datasource:
master:
url: jdbc:mysql://127.0.0.1:3306/ruoyi-vue-pro?useUnicode=true&characterEncoding=utf8
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
slave:
url: jdbc:mysql://127.0.0.1:3307/ruoyi-vue-pro?useUnicode=true&characterEncoding=utf8
username: root
password: 123456
driver-class-name: com.mysql.cj.jdbc.Driver
读写分离实现机制
注解驱动路由
yudao-cloud采用注解方式实现读写操作的自动路由:
// 写操作使用主库
@Master
@Transactional
public void createUser(User user) {
userMapper.insert(user);
}
// 读操作使用从库
@Slave
public User getUserById(Long id) {
return userMapper.selectById(id);
}
// 复杂业务场景使用明确注解
@DS(DataSourceEnum.MASTER)
public void complexBusinessOperation() {
// 业务逻辑
}
事务处理策略
对于跨数据源的事务操作,yudao-cloud使用@DSTransactional注解:
@DSTransactional
public void multiDataSourceOperation() {
// 操作主库
masterMapper.insert(data);
// 操作从库或其他数据源
slaveMapper.update(data);
// 事务会自动管理
}
数据库表设计规范
通用字段设计
yudao-cloud的所有表都遵循统一的字段设计规范:
CREATE TABLE `sys_user` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '用户ID',
`username` varchar(50) NOT NULL COMMENT '用户名',
`password` varchar(100) NOT NULL COMMENT '密码',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
`tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
PRIMARY KEY (`id`),
INDEX `idx_username` (`username`),
INDEX `idx_create_time` (`create_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='用户信息表';
核心表结构示例
1. 系统配置表
CREATE TABLE `infra_config` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '参数主键',
`category` varchar(50) NOT NULL COMMENT '参数分组',
`type` tinyint NOT NULL COMMENT '参数类型',
`name` varchar(100) NOT NULL DEFAULT '' COMMENT '参数名称',
`config_key` varchar(100) NOT NULL DEFAULT '' COMMENT '参数键名',
`value` varchar(500) NOT NULL DEFAULT '' COMMENT '参数键值',
`visible` bit(1) NOT NULL COMMENT '是否可见',
`remark` varchar(500) DEFAULT NULL COMMENT '备注',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='参数配置表';
2. 数据源配置表
CREATE TABLE `infra_data_source_config` (
`id` bigint NOT NULL AUTO_INCREMENT COMMENT '主键编号',
`name` varchar(100) NOT NULL DEFAULT '' COMMENT '参数名称',
`url` varchar(1024) NOT NULL COMMENT '数据源连接',
`username` varchar(255) NOT NULL COMMENT '用户名',
`password` varchar(255) NOT NULL DEFAULT '' COMMENT '密码',
`creator` varchar(64) DEFAULT '' COMMENT '创建者',
`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`updater` varchar(64) DEFAULT '' COMMENT '更新者',
`update_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
`deleted` bit(1) NOT NULL DEFAULT b'0' COMMENT '是否删除',
PRIMARY KEY (`id`)
) ENGINE=InnoDB COMMENT='数据源配置表';
性能优化策略
索引设计原则
yudao-cloud遵循以下索引设计最佳实践:
- 主键索引:所有表都必须有自增主键
- 唯一索引:保证业务数据的唯一性
- 组合索引:针对高频查询条件建立合适的组合索引
- 覆盖索引:减少回表查询,提升查询性能
查询优化技巧
// 使用QueryWrapperX进行链式查询
public PageResult<User> getUsers(UserPageReqVO reqVO) {
return userMapper.selectPage(reqVO, new QueryWrapperX<User>()
.likeIfPresent("username", reqVO.getUsername())
.eqIfPresent("status", reqVO.getStatus())
.betweenIfPresent("create_time", reqVO.getCreateTime())
.orderByDesc("id"));
}
// 使用Lambda表达式避免硬编码
public User getUserByUsername(String username) {
return userMapper.selectOne(new LambdaQueryWrapperX<User>()
.eq(User::getUsername, username));
}
监控与运维
数据库监控配置
yudao-cloud集成了Druid监控,可以通过以下配置启用:
spring:
datasource:
druid:
stat-view-servlet:
enabled: true
login-username: admin
login-password: 123456
web-stat-filter:
enabled: true
健康检查机制
系统提供以下健康检查端点:
/actuator/health:应用健康状态/actuator/metrics:性能指标监控/druid:数据库连接池监控
实战应用场景
场景一:用户管理模块
场景二:多数据源事务处理
@Service
@RequiredArgsConstructor
public class UserServiceImpl implements UserService {
private final UserMapper userMapper;
private final LogMapper logMapper;
@Override
@DSTransactional
public void createUserWithLog(UserCreateReqVO reqVO) {
// 操作主库 - 用户表
User user = UserConvert.INSTANCE.convert(reqVO);
userMapper.insert(user);
// 操作从库或其他数据源 - 日志表
Log log = new Log();
log.setContent("创建用户: " + user.getUsername());
logMapper.insert(log);
// 如果出现异常,两个操作都会回滚
}
}
最佳实践总结
配置建议
- 连接池配置:根据实际业务压力调整Druid连接池参数
- 超时设置:合理设置查询超时时间,避免长时间占用连接
- 监控告警:配置数据库监控告警,及时发现性能问题
开发规范
- 注解使用:明确使用
@Master、@Slave或@DS注解 - 事务管理:跨数据源操作必须使用
@DSTransactional - SQL优化:避免N+1查询,使用合适的索引
运维建议
- 定期备份:建立完善的数据库备份策略
- 性能监控:持续监控数据库性能指标
- 容量规划:根据业务增长进行数据库容量规划
结语
yudao-cloud通过MySQL+MyBatis Plus的多数据源和读写分离架构,为企业级应用提供了高性能、高可用的数据库解决方案。这种架构不仅提升了系统的处理能力,还通过清晰的代码规范和最佳实践,保证了系统的可维护性和扩展性。
在实际项目中,开发者可以根据业务需求灵活配置数据源,通过注解驱动的方式实现读写分离,同时利用MyBatis Plus的强大功能提升开发效率。这种架构设计为构建稳定可靠的企业级应用奠定了坚实的基础。
通过本文的详细解析,相信您对yudao-cloud的数据库架构有了更深入的理解,能够在实际项目中更好地应用和优化这一技术方案。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



