当我们的业务越来越复杂时,可能会遇到多个数据源的情况,而我们的业务又达不到使用分库分表的插件的数据量和请求量时,这时我们可以采用数据源切换的方式来实现我们所需的业务。
/* 这两个类来对应数据源,而且如果添加数据源也是特别方便的,方便后期
数据源的扩展 */
public interface DataSources {
String MASTER_DB = "masterDB";
String SLAVE_DB = "slaveDB";
}
@Configuration
public class DataSourceConfig {
//destroy-method="close"的作用是当数据库连接不使用的时候,就把该连接重新放到数据池中,方便下次使用调用.
@Bean(destroyMethod = "close", name = DataSources.MASTER_DB)
@ConfigurationProperties(prefix = "spring.datasource")
public DataSource dataSource(){
return DataSourceBuilder.create().type(DruidDataSource.class).build();
}
@Bean(destroyMethod = "close", name = DataSources.SLAVE_DB)
@ConfigurationProperties(prefix = "spring.datasource-slave")
public DataSource dataSourceSlave(){
return DataSourceBuilder.create().type(DruidDataSource.class).build();
}
}
复制
@Configuration
@MapperScan(basePackages = {"com.example.multilpeDataSource.dao"})
public class MybatisConfig {
@Autowired
@Qualifier(DataSources.MASTER_DB)
private DataSource masterDB;
@Autowired
@Qualifier(DataSources.SLAVE_DB)
private DataSource slaveDB;
@Bean(name = "dynamicDataSource")
public DataSource dynamicDataSource(){
DynamicDataSource dynamicDataSource = new DynamicDataSource();
//设置默认数据源
dynamicDataSource.setDefaultTargetDataSource(masterDB);
//map用来存储数据源
Map<Object , Object> dsMap = new HashMap<>();
dsMap.put(DataSources.MASTER_DB, masterDB);
dsMap.put(DataSources.SLAVE_DB, slaveDB);
dynamicDataSource.setTargetDataSources(dsMap);
return dynamicDataSource;
}
@Bean
@ConfigurationProperties(prefix = "mybatis")
public SqlSessionFactoryBean sqlSessionFactoryBean(){
SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
//配置数据源,这里是关键配置,如果没有将dynamicDataSource作为数据源则不能实现切换
sqlSessionFactoryBean.setDataSource(dynamicDataSource());
return sqlSessionFactoryBean;
}
}
复制
/* 注解部分 */
@Retention(RetentionPolicy.RUNTIME)
@Target({
ElementType.METHOD
})
public @interface RoutingDataSource {
String value() default DataSources.MASTER_DB;
}
/* AOP部分 */
@Aspect
@Component
public class DynamicDataSourceAspect {
/**
* 前置设置dataSource
* @param joinPoint
*/
@Before("@annotation(com.example.multilpeDataSource.config.RoutingDataSource)")
public void beforeSwitchDS(JoinPoint joinPoint){
MethodSignature methodSignature = (MethodSignature) joinPoint.getSignature();
Method method = methodSignature.getMethod();
/* 默认的数据源我们是从DataSourceContextHolder类中获取 */
String dataSource = DataSourceContextHolder.DEFAULT_DATASOURCE;
/* 然后判断我们的注解是否在我们设为切点的方法上 */
if (method.isAnnotationPresent(RoutingDataSource.class)){
RoutingDataSource routingDataSource = method.getDeclaredAnnotation(RoutingDataSource.class);
dataSource = routingDataSource.value();
}
DataSourceContextHolder.setDB(dataSource);
}
/**
* 后置清空缓存
* @param joinPoint
*/
@After("@annotation(com.example.multilpeDataSource.config.RoutingDataSource)")
public void afterSwitchDS(JoinPoint joinPoint){
DataSourceContextHolder.clearDB();
}
}
复制
文章转载自Lord Lean Notes,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【MySQL 30周年庆】MySQL 8.0 OCP考试限时免费!教你免费领考券
墨天轮小教习
2680次阅读
2025-04-25 18:53:11
MySQL 30 周年庆!MySQL 8.4 认证免费考!这次是认真的。。。
严少安
797次阅读
2025-04-25 15:30:58
【活动】分享你的压箱底干货文档,三篇解锁进阶奖励!
墨天轮编辑部
451次阅读
2025-04-17 17:02:24
MySQL 9.3 正式 GA,我却大失所望,新特性亮点与隐忧并存?
JiekeXu
411次阅读
2025-04-15 23:49:58
3月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
368次阅读
2025-04-15 14:48:05
openHalo问世,全球首款基于PostgreSQL兼容MySQL协议的国产开源数据库
严少安
360次阅读
2025-04-07 12:14:29
记录MySQL数据库的一些奇怪的迁移需求!
陈举超
263次阅读
2025-04-15 15:27:53
MySQL 8.0 OCP 1Z0-908 考试解析指南(二)
JiekeXu
240次阅读
2025-04-30 17:37:37
MySQL 8.4 新特性深度解析:功能增强、废弃项与移除项全指南
JiekeXu
218次阅读
2025-04-18 20:21:32
SQL优化 - explain查看SQL执行计划(下)
金同学
217次阅读
2025-05-06 14:40:00