一 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