当前位置 博文首页 > 文章内容

    springboot&数据库连接池&切面动态数据源

    作者: 栏目:未分类 时间:2020-07-26 18:00:33

    本站于2023年9月4日。收到“大连君*****咨询有限公司”通知
    说我们IIS7站长博客,有一篇博文用了他们的图片。
    要求我们给他们一张图片6000元。要不然法院告我们

    为避免不必要的麻烦,IIS7站长博客,全站内容图片下架、并积极应诉
    博文内容全部不再显示,请需要相关资讯的站长朋友到必应搜索。谢谢!

    另祝:版权碰瓷诈骗团伙,早日弃暗投明。

    相关新闻:借版权之名、行诈骗之实,周某因犯诈骗罪被判处有期徒刑十一年六个月

    叹!百花齐放的时代,渐行渐远!



     

     

    DateSource 定义注解
    DateSourceContext 定义ThreadLocal上下文
    DataSourceRouteAspect会拦截注解dataSource的方法,业务方法之前设置数据源,设置到ThreadLocal中
                         也可根据业务参数自主设置数据源,达到分库效果 
    DruidConfig 配置多数据源
    MybatisConfig 扫描sql配置类
    RouteDataSource 通过继承AbstractRoutingDataSource重写,获取ThreadLocal中的数据源
    
    
    
    @Target({ ElementType.METHOD,ElementType.TYPE,ElementType.PARAMETER})
    @Retention(RetentionPolicy.RUNTIME)
    @Documented
    public @interface DataSource {
        String value() default  "";
    }
    
    public class DataSourceContext {
        private static final ThreadLocal<String> context = new ThreadLocal<>();
        public static void setDataSource(String value){
            context.set(value);
        }
        public static String getDataSource(){
            return context.get();
        }
        public static void clearDataSource(){
            context.remove();
        }
    }
    
    @Aspect
    @Component
    public class DataSourceRouteAspect {
        @Before("@annotation(dataSource)")
        public void selectDateSource(JoinPoint point, DataSource dataSource){
            String value = dataSource.value();
            DataSourceContext.setDataSource(value);
        }
        @After("@annotation(dataSource)")
        public void removeDataSource(JoinPoint point, DataSource dataSource){
            DataSourceContext.clearDataSource();
        }
    }
    
    @Configuration
    public class DruidConfig {
    //    @Value("${mysql.one.aliasName}")
    //    private String aliasNameOne;
    //    @Primary
        @Bean(name="dataSourceOne",initMethod = "init",destroyMethod = "close")
        @ConfigurationProperties(prefix = "mysql.one")
        public DruidDataSource dataSourceOne(){
            DruidDataSource dataSource = new DruidDataSource();
            dataSource.setQueryTimeout(300);
            dataSource.setTestWhileIdle(true);
            dataSource.setTestOnBorrow(true);
            dataSource.setTestOnReturn(true);
            dataSource.setTimeBetweenEvictionRunsMillis(600000);
            dataSource.setMinEvictableIdleTimeMillis(300000);
            return dataSource;
        }
    //    @Bean(name="dataSourceTwo",initMethod = "init",destroyMethod = "close")
    //    @ConfigurationProperties(prefix = "mysql.two")
    //    public DruidDataSource dataSourceOne(){
    //        return dataSource;
    //    }
        @Bean(name = "routeDataSource")
        public RouteDataSource dataSource(@Qualifier("dataSourceOne")DruidDataSource dataSourceOne
    //    ,@Qualifier("dataSourceTwo")DruidDataSource dataSourceTwo
        ){
            Map<Object, Object> targetDataSources = new HashMap<>();
            targetDataSources.put("dataSourceOne",dataSourceOne);
    //        targetDataSources.put("dataSourceTwo",dataSourceTwo);
            RouteDataSource dataSource = new RouteDataSource();
            dataSource.setTargetDataSources(targetDataSources);
            dataSource.setDefaultTargetDataSource(dataSourceOne);
            System.out.println("routeDataSource******************"+dataSource);
            return  dataSource;
        }
    }
    
    @Configuration
    public class DruidConfig {
    //    @Value("${mysql.one.aliasName}")
    //    private String aliasNameOne;
    //    @Primary
        @Bean(name="dataSourceOne",initMethod = "init",destroyMethod = "close")
        @ConfigurationProperties(prefix = "mysql.one")
        public DruidDataSource dataSourceOne(){
            DruidDataSource dataSource = new DruidDataSource();
            dataSource.setQueryTimeout(300);
            dataSource.setTestWhileIdle(true);
            dataSource.setTestOnBorrow(true);
            dataSource.setTestOnReturn(true);
            dataSource.setTimeBetweenEvictionRunsMillis(600000);
            dataSource.setMinEvictableIdleTimeMillis(300000);
            return dataSource;
        }
    //    @Bean(name="dataSourceTwo",initMethod = "init",destroyMethod = "close")
    //    @ConfigurationProperties(prefix = "mysql.two")
    //    public DruidDataSource dataSourceOne(){
    //        return dataSource;
    //    }
        @Bean(name = "routeDataSource")
        public RouteDataSource dataSource(@Qualifier("dataSourceOne")DruidDataSource dataSourceOne
    //    ,@Qualifier("dataSourceTwo")DruidDataSource dataSourceTwo
        ){
            Map<Object, Object> targetDataSources = new HashMap<>();
            targetDataSources.put("dataSourceOne",dataSourceOne);
    //        targetDataSources.put("dataSourceTwo",dataSourceTwo);
            RouteDataSource dataSource = new RouteDataSource();
            dataSource.setTargetDataSources(targetDataSources);
            dataSource.setDefaultTargetDataSource(dataSourceOne);
            System.out.println("routeDataSource******************"+dataSource);
            return  dataSource;
        }
    }
    
    public class RouteDataSource extends AbstractRoutingDataSource {
        @Override
        protected Object determineCurrentLookupKey() {
            return DataSourceContext.getDataSource();
        }
    }
    
    
    mapper配置类
    import cn.com.config.dbConfig.DataSource;
    import org.apache.ibatis.annotations.Mapper;
    import org.apache.ibatis.annotations.Select;
    @Mapper
    public interface MyTestIbatis extends BaseMapper<String>{
        @DataSource("dataSourceOne")
        @Select("select id from tbl_user")
        List<String> selectStr();
    }
    
    import tk.mybatis.mapper.common.Mapper;
    public interface BaseMapper<T> extends Mapper<T> {
    }
    
    
    @Autowired
    MyTestIbatis myTestIbatis;
    myTestIbatis.selectStr()