再此先说明哈!我和网上很多人的方法不一样,我用的是注解的方式,网上有很多博友是有那种一种数据库一个mapper包,一种数据库一个实体包,我这个是直接放一块的,你们按照自己的方法用哈!不要踩坑哦!
首先是我数据源的配置yum文件的配置:(配置的这个文件注意一下空格)
//mysql数据库
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/db_mj?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=true
username: root
password: toot
#sqlserver数据库配置
dynamic:
datasource:
slave1:
# driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
url: jdbc:sqlserver://192.168.1.235;databasename=DB
username: root
password: root
创建一个datasource包
1.创建一个annotation包,在这个包里面创建一个文件DataSource
/**
* @Author Simon
* @Method
* @Version 1.0
* @Return
* @Exception 多文件注解
* @Date 2019-08-23 0023 09:49:53
*/
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
public @interface DataSource {
String value() default "";
}
2.创建一个aspect包,里面创建一个文件:DataSourceAspect
/**
* @Author Simon
* @Method
* @Version 1.0
* @Return
* @Exception 多数据源,切面处理类
* @Date 2019-08-23 0023 09:52:09
*/
@Aspect
@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class DataSourceAspect {
protected Logger logger = LoggerFactory.getLogger(getClass());
@Pointcut("@annotation(com.mj.admin.datasource.annotation.DataSource) " +
"|| @within(com.mj.admin.datasource.annotation.DataSource)")
public void dataSourcePointCut() {
}
@Around("dataSourcePointCut()")
public Object around(ProceedingJoinPoint point) throws Throwable {
MethodSignature signature = (MethodSignature) point.getSignature();
Class targetClass = point.getTarget().getClass();
Method method = signature.getMethod();
DataSource targetDataSource = (DataSource)targetClass.getAnnotation(DataSource.class);
DataSource methodDataSource = method.getAnnotation(DataSource.class);
if(targetDataSource != null || methodDataSource != null){
String value;
if(methodDataSource != null){
value = methodDataSource.value();
}else {
value = targetDataSource.value();
}
DynamicContextHolder.push(value);
logger.debug("set datasource is {}", value);
}
try {
return point.proceed();
} finally {
DynamicContextHolder.poll();
logger.debug("clean datasource");
}
}
}
3.创建一个config包:里面创建文件:DynamicContextHolder,DynamicDataSource,DynamicDataSourceConfig,DynamicDataSourceFactory四个文件下面我依次贴代码了
/**
* @Author Simon
* @Method
* @Version 1.0
* @Return
* @Exception 多数据源上下文
* @Date 2019-08-23 0023 09:58:03
*/
public class DynamicContextHolder {
@SuppressWarnings("unchecked")
private static final ThreadLocal<Deque<String>> CONTEXT_HOLDER = new ThreadLocal() {
@Override
protect