SpringBoot+MybatisPlus(多数据源和主从分离)
简介
dynamic-datasource-spring-boot-starter 基于 springBoot2.0.
它适用于读写分离,一主多从的环境。
主数据库使用 INSERT
UPDATE
DELETE
操作.
从数据库使用 SELECT
操作.
如果你的项目比较复杂,建议使用 sharding-jdbc .
示例
dynamic-datasource-example 一个简单能直接运行的项目。
使用方法
- 引入dynamic-datasource-spring-boot-starter。
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>dynamic-datasource-spring-boot-starter</artifactId>
<version>1.0.0</version>
</dependency>
- 配置主从数据源。
spring.datasource.dynamic.master 配置唯一主数据源(写库)
spring.datasource.dynamic.slaves 配置每一个从数据源(读库)
spring:
datasource:
dynamic:
master:
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://47.100.20.186:3307/dynamic?characterEncoding=utf8&useSSL=false
slaves:
one:
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://47.100.20.186:3308/dynamic?characterEncoding=utf8&useSSL=false
two:
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://47.100.20.186:3309/dynamic?characterEncoding=utf8&useSSL=false
- 切换数据源。
使用 @DS 注解切换数据源。
可以注解在方法上,可以注解在service实现或mapper接口方法上。
注解 | 结果 |
---|---|
没有@DS | 主库 |
@DS("slave") | 存在slave指定slave,不存在主库 |
@DS | 根据DynamicDataSourceStrategy策略,选择一个从库。默认负载均衡策略。 |
@Service
public class UserServiceImpl implements UserService {
@Autowired
private JdbcTemplate jdbcTemplate;
@DS("one")
public List<Map<String, Object>> selectAll() {
return jdbcTemplate.queryForList("select * from user");
}
@Override
@DS
public List<Map<String, Object>> selectByCondition() {
return jdbcTemplate.queryForList("select * from user where age >10");
}
}
在mybatis环境下也可注解在mapper接口层。
public interface UserMapper {
@Insert("INSERT INTO user (name,age) values (#{name},#{age})")
boolean addUser(@Param("name") String name, @Param("age") Integer age);
@Update("UPDATE user set name=#{name}, age=#{age} where id =#{id}")
boolean updateUser(@Param("id") Integer id, @Param("name") String name, @Param("age") Integer age);
@Delete("DELETE from user where id =#{id}")
boolean deleteUser(@Param("id") Integer id);
@Select("SELECT * FROM user")
@DS
List<User> selectAll();
}
自定义
- 自定义数据源来源。
数据源来源的默认实现是YmlDynamicDataSourceProvider,其从yaml或properties中读取信息并解析出主从信息。
场景:有些人想把从库信息配置到主库的某个表中,如有个表名slave_datasource。现在需要用户自己去实现以下接口并注入。
public interface DynamicDataSourceProvider {
/**
* load master
*
* @return masterDataSource
*/
DataSource loadMasterDataSource();
/**
* load slaves
*
* @return slaveDataSource
*/
Map<String, DataSource> loadSlaveDataSource();
}
- 自定义从库选择策略。
默认的策略是负载均衡的策略,LoadBalanceDynamicDataSourceStrategy。 也提供了一个随机策略,RandomDynamicDataSourceStrategy。
public interface DynamicDataSourceStrategy {
/**
* determine a slaveId
*
* @param slaveDataSourceLookupKeys slaveKeys
* @return slaveId
*/
String determineSlaveDataSource(String[] slaveDataSourceLookupKeys);
}
重写策略并注入。
@Bean
public DynamicDataSourceStrategy dynamicDataSourceStrategy() {
return new RandomDynamicDataSourceStrategy();
}
参考:https://gitee.com/tkmeeta/dynamic-datasource-spring-boot-starter
DEMO:https://pan.baidu.com/s/1TWEVnOcUGoYVTy0YKbah0w
标签:
mybatis
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
2016-05-30 SQLSERVER TRUE、FALSE、UNKNOWN