一 pom依赖配置
<!-- 连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.5</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
二 application.properties配置
#数据源1
spring.datasource.first.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.first.url=jdbc:mysql://xxx.xxx.x.x:3306/cmstest?useSSL=false&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
spring.datasource.first.username=xx
spring.datasource.first.password=xx
#数据源2
spring.datasource.secondary.driver-class-name = com.mysql.jdbc.Driver
spring.datasource.secondary.url=jdbc:mysql://xxx.xx.xx.xx:3306/eshop?useSSL=false&characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull
spring.datasource.secondary.username=xx
spring.datasource.secondary.password=xx
三 数据源切面配置
class1
@Retention(RetentionPolicy.RUNTIME)
@Target({
ElementType.METHOD
})
public @interface DBS {
DataSourceType value() default DataSourceType.primaryDataSource;
}
class2
@Aspect
@Component
public class DBSAspect {
@Before("@annotation(DBS)")
public void beforeSwitchDS(JoinPoint point){
//获得当前访问的class
Class<?> className = point.getTarget().getClass();
//获得访问的方法名
String methodName = point.getSignature().getName();
//得到方法的参数的类型
Class[] argClass = ((MethodSignature)point.getSignature()).getParameterTypes();
DataSourceType dataSourceType = DataSourceType.primaryDataSource;
try {
// 得到访问的方法对象
Method method = className.getMethod(methodName, argClass);
// 判断是否存在@DS注解
if (method.isAnnotationPresent(DBS.class)) {
DBS annotation = method.getAnnotation(DBS.class);
// 取出注解中的数据源名
dataSourceType = annotation.value();
}
} catch (Exception e) {
e.printStackTrace();
}
// 切换数据源
DatabaseContextHolder.setDB(dataSourceType);
}
@After("@annotation(DBS)")
public void afterSwitchDS(JoinPoint point){
DatabaseContextHolder.clearDB();
}
}
class3
public class DatabaseContextHolder {
private static final ThreadLocal<DataSourceType> contextHolder = new ThreadLocal<>();
// 设置数据源名
public static void setDB(DataSourceType dbType) {
contextHolder.set(dbType);
}
// 获取数据源名
public static DataSourceType getDB() {
System.out.println("beforce 根据切面获取数据源");
System.out.println(contextHolder.get());
return (contextHolder.get());
}
// 清除数据源名
public static void clearDB() {
System.out.println("after 清除数据源");
contextHolder.remove();
}
}
class4
public enum DataSourceType {
primaryDataSource, //默认第一个库
secondaryDataSource //第二个库
}
class5
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DatabaseContextHolder.getDB();
}
}
四 mybatis配置及druid配置
@Configuration
public class MybatisBaseConfig {
@Bean(name = "primaryDataSource")
@Qualifier("primaryDataSource")
@ConfigurationProperties(prefix = "spring.datasource.first")
public DataSource primaryDataSource(){
//return MasterSlaveDataSourceFactory.createDataSource(ResourceUtils.getFile("classpath:sharding-jdbc.yml"));
return DruidDataSourceBuilder.create().build();
// return DataSourceBuilder.create().build();
}
@Bean(name = "secondaryDataSource")
@Qualifier("secondaryDataSource")
@Primary
@ConfigurationProperties(prefix = "spring.datasource.secondary")
public DataSource secondaryDataSource(){
return DruidDataSourceBuilder.create().build();
// return DataSourceBuilder.create().build();
}
@Bean(name = "dynamicDS1")
public DataSource dataSource(@Qualifier("primaryDataSource")DataSource dataSource1,@Qualifier("secondaryDataSource")DataSource dataSource2) {
DynamicDataSource dynamicDataSource = new DynamicDataSource();
// 默认数据源
dynamicDataSource.setDefaultTargetDataSource(dataSource1);
// 配置多数据源
Map<Object, Object> dsMap = new HashMap(5);
dsMap.put(DataSourceType.primaryDataSource, dataSource1);
dsMap.put(DataSourceType.secondaryDataSource, dataSource2);
dynamicDataSource.setTargetDataSources(dsMap);
return dynamicDataSource;
}
@Bean
public ServletRegistrationBean druidStatViewServlet(){
ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
servletRegistrationBean.setServlet(new StatViewServlet());
servletRegistrationBean.addUrlMappings("/druid
@Bean
public FilterRegistrationBean druidStatFilter(){
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new WebStatFilter());
//添加过滤规则.
filterRegistrationBean.addUrlPatterns("/*");
//添加不需要忽略的格式信息.
filterRegistrationBean.addInitParameter("exclusions","*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
return filterRegistrationBean;
}
}
五 启动后访问地址
druid数据监控:http://localhost:3005/druid/ admin 123456
有问题欢迎留言, 交流QQ 1360215811