天天看點

springboot druid連接配接池內建多資料源(mysql為例)

一 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

繼續閱讀