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 = "primaryJdbcTemplate")
        public JdbcTemplate primaryJdbcTemplate(@Qualifier("primaryDataSource")DataSource dataSource){
            return new JdbcTemplate(dataSource);
        }
     
        @Bean(name = "secondaryJdbcTemplate")
        public JdbcTemplate secondaryJdbcTemplate(@Qualifier("secondaryDataSource")DataSource dataSource){
            return new JdbcTemplate(dataSource);
        }*/
  /*
   * @Autowired
    @Qualifier("primaryJdbcTemplate")
    private JdbcTemplate jt;*/
        
        @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;
        }   
        /**
         * 注册一个StatViewServlet
         * @return
         */
        @Bean
        public ServletRegistrationBean druidStatViewServlet(){
            ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
            servletRegistrationBean.setServlet(new StatViewServlet());
            servletRegistrationBean.addUrlMappings("/druid/*");
            //添加初始化参数:initParams
            //白名单:
            servletRegistrationBean.addInitParameter("allow","127.0.0.1");
            //IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.
            servletRegistrationBean.addInitParameter("deny","192.168.1.73");
            //登录查看信息的账号密码.
            servletRegistrationBean.addInitParameter("loginUsername","admin");
            servletRegistrationBean.addInitParameter("loginPassword","123456");
            //是否能够重置数据.
            servletRegistrationBean.addInitParameter("resetEnable","false");
            return servletRegistrationBean;
        }

        /**
         * 注册一个:filterRegistrationBean
         * @return
         */
        @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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值