ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

springboot aop实现多数据源 读写分离

2022-05-07 13:00:52  阅读:141  来源: 互联网

标签:return springboot 数据源 DataSource aop new targetDataSource public


实现思路:继承 AbstractRoutingDataSource 实现动态切换(aop对于主从变量进行切换)根据变量key读取对应的数据源实例 必须覆盖SqlSessionFactory 、SqlSessionTemplate 

@Configuration
public class DataSourceConfig {
/**
* 主数据库数据源,存入Spring容器
* 注解@Primary表示主数据源
* @return
*/
@ConfigurationProperties(prefix = "spring.datasource.master")
@Primary
@Bean
public DataSource masterDataSource(){
return DruidDataSourceBuilder.create().build();
}

/**
* 从数据库数据源,存入Spring容器
* @return
*/
@ConfigurationProperties(prefix = "spring.datasource.slave")
@Bean
public DataSource slaveDataSource(){
return DruidDataSourceBuilder.create().build();
}

/**
* 决定最终数据源
* @param masterDataSource
* @param slaveDataSource
* @return
*/
@Bean
public DynamicDataSource targetDataSource(@Qualifier("masterDataSource") DataSource masterDataSource, @Qualifier("slaveDataSource") DataSource slaveDataSource){
//存放主从数据源
Map<Object,Object> targetDataSource = new HashMap<>(2);
//主数据源
targetDataSource.put(DBTypeEnum.MASTER, masterDataSource);
//从数据源
targetDataSource.put(DBTypeEnum.SLAVE, slaveDataSource);
//实现动态切换
DynamicDataSource dynamicDataSource = new DynamicDataSource();
//绑定所有数据源
dynamicDataSource.setTargetDataSources(targetDataSource);
//设置默认数据源
dynamicDataSource.setDefaultTargetDataSource(masterDataSource);
return dynamicDataSource;
}

@Bean
public SqlSessionFactory sessionFactory(@Qualifier("targetDataSource") DataSource dynamicDataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setMapperLocations(
new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/*"));
bean.setDataSource(dynamicDataSource);
return bean.getObject();
}

@Bean
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory, ExecutorType.BATCH);
}

/***
* 当自定义数据源,用户必须注入,否则事务控制不生效
* @param dataSource
* @return
*/
@Bean
public DataSourceTransactionManager dataSourceTx(@Qualifier("targetDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}

---------------------------------------------------------------------------------------------------------------------------------------------------
public class DynamicDataSource extends AbstractRoutingDataSource {

private Logger logger = LoggerFactory.getLogger(DynamicDataSource.class);

@Override
protected Object determineCurrentLookupKey() {
logger.info("使用数据源:"+DynamicDbUtil.get());
return DynamicDbUtil.get();
}
}
---------------------------------------------------------------------------------------------------------------------------------------------------
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
@Documented
public @interface DBType {

DBTypeEnum dbType() default DBTypeEnum.MASTER;

}
public enum DBTypeEnum {
/**
* 主数据库
*/
MASTER,

/**
* 从数据库
*/
SLAVE;
}
------------------------------------------------------------------------------------------------------------------------------------------------------------------
@Aspect
@Component
public class DataSourceAopAspect {
private Logger logger = LoggerFactory.getLogger(DataSourceAopAspect.class);

@Pointcut("@annotation(com.cn.datasource.annotation.DBType)")
public void dataSourceAopAspect(){

}

/**
* 配置前置通知,切换数据源为从数据库
*/
@Before("dataSourceAopAspect()")
public void readAdvise(JoinPoint joinPoint){
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature = (MethodSignature) signature;
Method method = methodSignature.getMethod();
DBType dbTypeAn = method.getAnnotation(DBType.class);
DBTypeEnum dbType = dbTypeAn.dbType();
//先移除
DynamicDbUtil.remove();
//设置数据源
DynamicDbUtil.set(dbType);
logger.info("切换到数据源:"+DynamicDbUtil.get());
}
}

标签:return,springboot,数据源,DataSource,aop,new,targetDataSource,public
来源: https://www.cnblogs.com/feizai-java/p/16242045.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有