1.定义数据源类型
/**
* contextHolder保存一个线程安全的 dataBaseType
* @author xuyp
*
*/
public class DatabaseContextHolder {
private static final ThreadLocal<DataBaseType> contextHolder = new ThreadLocal<>();
public enum DataBaseType {//数据源类型
bpmDataBase,
pasDataBase
}
public static DataBaseType getDataBaseType() {
return contextHolder.get();
}
public static void setDataBaseType(DataBaseType dbType) {
contextHolder.set(dbType);
}
}
2.动态数据源
/**
* 动态数据源(需要继承AbstractRoutingDataSource)
* @author xuyp
*/
public class DynamicDataSource extends AbstractRoutingDataSource{
@Override
protected Object determineCurrentLookupKey() {
return DatabaseContextHolder.getDataBaseType();
}
}
3.根据Service类型Aop动态切换数据源
/**
* @author xuyp
* Aop动态切换数据源
*/
@Aspect
@Component
public class DataSourceAspect {
/**
* 使用空方法定义切点表达式
*/
@Pointcut("execution(* com.monitor.service.**.*(..))")
public void declareJoinPointExpression() {
}
@Before("declareJoinPointExpression()")
public void setDataSourceKey(JoinPoint jPoint) {
//根据实例类型动态切换数据源
if(jPoint.getTarget() instanceof IBpmDataService) {
DatabaseContextHolder.setDataBaseType(DataBaseType.bpmDataBase);
}
if(jPoint.getTarget() instanceof IPasService) {
DatabaseContextHolder.setDataBaseType(DataBaseType.pasDataBase);
}
}
}
4.数据源配置
/**
* 数据源配置
* @author xuyp
*/
@Configuration
@MapperScan(basePackages="com.monitor.mapper",sqlSessionTemplateRef="sqlSessionFactoryTemplate")
public class DataSourceConfig {
@Primary
@Bean(name="bpmDataSource")
@ConfigurationProperties(prefix="spring.datasource.bpm")
public DataSource getDataSourceBpm() {
return DataSourceBuilder.create().build();
}
@Bean(name="pasDataSource")
@ConfigurationProperties(prefix="spring.datasource.pas")
public DataSource getDataSourcePas() {
return DataSourceBuilder.create().build();
}
/**
* 动态数据源
* @param bpmDataSource
* @param pasDataSource
* @return
*/
@Bean(name="dynamicDataSource")
public DynamicDataSource dataSource(@Qualifier("bpmDataSource") DataSource bpmDataSource,
@Qualifier("pasDataSource") DataSource pasDataSource) {
Map<Object,Object> targetDataSource = new HashMap<>();
targetDataSource.put(DataBaseType.bpmDataBase, bpmDataSource);
targetDataSource.put(DataBaseType.pasDataBase, pasDataSource);
DynamicDataSource dataSource = new DynamicDataSource();
dataSource.setTargetDataSources(targetDataSource);
dataSource.setDefaultTargetDataSource(bpmDataSource);//默认数据源
return dataSource;
}
/**
* 创建工厂
* @param dynamicDataSource
* @return
* @throws Exception
*/
@Bean(name="sqlSessionFactory")
public SqlSessionFactory sqlSessionFactory(@Qualifier("dynamicDataSource")
DataSource dynamicDataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dynamicDataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources("classpath*:mapper/*.xml"));
return bean.getObject();
}
/**
* 事务管理
* @param dynamicDataSource
* @return
*/
@Bean("dataSourceTransactionManager")
public DataSourceTransactionManager
dataSourceTransactionManager(@Qualifier("dynamicDataSource")
DataSource dynamicDataSource) {
return new DataSourceTransactionManager(dynamicDataSource);
}
/**
* 创建模板
* @param sqlSessionFactory
* @return
*/
@Bean(name="sqlSessionFactoryTemplate")
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("sqlSessionFactory")
SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}