最新搭建的博客:http://www.cnstudio.top/
创建项目就跳过了,自行百度创建SSM项目及一般的配置。
此文章前提是SSM基本配置已经完成,可以连接单数源。
有两种方法,但大致一样,第一种是第一次找到的,但只能在controller层注解,从代码分工来讲,controller不应该处理数据方面的问题,所以第一种方法不推荐,第二种是在service层注解,推荐使用。
方法1
第一步:修改db.properties文件
#driver=com.mysql.jdbc.Driver
jdbc.driver=com.mysql.cj.jdbc.driver
jdbc.url=jdbc:mysql://localhost:3306/
jdbc.dbnameDV = dv
jdbc.dbnameEcharts = echarts
jdbc.params = useUnicode=true&characterEncoding=UTF-8&serverTimezone=UTC&useSSL=false&allowPublicKeyRetrieval=true
jdbc.username=root
jdbc.password=root
#配置初始化大小、最小、最大
initialSize=0
maxActive=8
minIdle=0
maxIdle=8
#配置获取连接等待超时的时间
maxWait=20000
validationQuery=select 1
#打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements=true
maxPoolPreparedStatementPerConnectionSize=10
#配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis=60000
#配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis=1800000
其中,标红的为两个不同的数据库名。
第二步:配置db.xml
其中,标红的为多数据源的切换,上面已经配置了多个数据源,在这指定切换数据源的类,以及数据源。
第三步:在spring-mybatis.xml(spring和mybatis整合配置文件)将数据源指定为多数据源切换的id,即:dynamicDataSource。
第四步:在事务管理的配置文件中,修改数据源,同上。并加入切面配置
标红的为注意代码
第五步:在spring-mvc(spring和mvc整合配置文件)中,开启aop,对类代理
application/json;charset=UTF-8
标红代码为注意代码
第六步:创建自定义数据源选择器类DynamicDataSource
package com.DV.DataSource;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource {
private static final ThreadLocal dataSourceKey = new InheritableThreadLocal();
public static void setDataSourceKey(String dataSource){
dataSourceKey.set(dataSource);
}
@Override
protected Object determineCurrentLookupKey() {
return dataSourceKey.get();
}
}
第七步:自定义注解DataSourceChange
package com.DV.DataSource;
import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
/**
* 定义DataSource的注解
*/
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD,ElementType.TYPE})
@Documented
public @interface DataSourceChange {
String dataSource() default "";
}
第八步:前置通知(这里切的是controller)
package com.DV.DataSource;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.Signature;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.aspectj.lang.reflect.MethodSignature;
import java.lang.reflect.Method;
@Aspect
public class LogAopAction {
//配置接入点
@Pointcut("execution(* com.DV.controller..*.*(..))")
private void controllerAspect(){}//定义一个切入点
@Before("controllerAspect()")
public void dataSwitch(JoinPoint joinPoint){
Signature signature = joinPoint.getSignature();
MethodSignature methodSignature =(MethodSignature) signature;
Method method = methodSignature.getMethod();
DataSourceChange data = null;
String dataSource = "";
if(method != null){
data = method.getAnnotation(DataSourceChange.class);
if(data != null){
dataSource = data.dataSource();
if(dataSource != null){
DynamicDataSource.setDataSourceKey(dataSource);
}
}
}
}
}
在conrtoller中的方法上使用:@DataSourceC(dataSource="数据源ID")即可,测试代码如下:
@RequestMapping("test")
@ResponseBody
@DataSourceC(dataSource="dataSourceE")
public List
测试结果如下:
如图,测试通过,可以注解改变数据源。参考文章地址:https://blog.csdn.net/weixin_38897274/article/details/78529940
方法2
1、创建接口DataSource,用于定义注解。
package com.DV.entity;
import java.lang.annotation.ElementType;
import java.lang.annotation.Target;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.METHOD)
public @interface DataSource {
String value();
}
2、定义类DynamicDataSource,用于重写AbstractRoutingDataSource以及获取和设置数据源
package com.DV.entity;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource {
public static final ThreadLocal holder = new ThreadLocal();
//设置数据源
public static void setDataSource(String datasource) {
holder.set(datasource);
}
//获取数据源
private String getDataSource() {
return holder.get();
}
//清除数据源
public static void clearDataSource() {
holder.remove();
}
@Override
protected Object determineCurrentLookupKey() {
return getDataSource();
}
}
3、定义类DataSourceAspect,用于AOP切面。
package com.DV.entity;
import java.lang.reflect.Method;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.reflect.MethodSignature;
public class DataSourceAspect {
//切换数据源
public void before(JoinPoint point)
{
Object target = point.getTarget();
System.out.println(target.toString());
String method = point.getSignature().getName();
System.out.println(method);
Class>[] classz = target.getClass().getInterfaces();
Class>[] parameterTypes = ((MethodSignature) point.getSignature())
.getMethod().getParameterTypes();
try {
Method m = classz[0].getMethod(method, parameterTypes);
System.out.println(m.getName());
if (m != null && m.isAnnotationPresent(DataSource.class)) {
DataSource data = m.getAnnotation(DataSource.class);
DynamicDataSource.setDataSource(data.value());
}
} catch (Exception e) {
e.printStackTrace();
}
}
//清除数据源,使用默认数据源
public void after(){
DynamicDataSource.clearDataSource();
}
}
}
4、最后,还需要修改spring-mvc配置文件。
5、在service方法中使用
package com.DV.service;
import com.DV.entity.DataSource;
import java.util.List;
import java.util.Map;
public interface dataGraphService {
List echartSet(String corp_id, String type);
@DataSource("Echarts")
List test();
}
测试可以切换。
参考文章地址:https://blog.csdn.net/wolfjin/article/details/72465668