您好, 欢迎来到 !    登录 | 注册 | | 设为首页 | 收藏本站

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

bubuko 2022/1/25 19:31:45 java 字数 5908 阅读 1043 来源 http://www.bubuko.com/infolist-5-1.html

DateSource 定义注解 DateSourceContext 定义ThreadLocal上下文 DataSourceRouteAspect会拦截注解dataSource的方法,业务方法之前设置数据源,设置到ThreadLocal中 也可根据业务参数自主设置数据源,达到分库效果 DruidCon ...

 

 

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()

  

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

原文:https://www.cnblogs.com/xingminghui111/p/13381232.html


如果您也喜欢它,动动您的小指点个赞吧

除非注明,文章均由 laddyq.com 整理发布,欢迎转载。

转载请注明:
链接:http://laddyq.com
来源:laddyq.com
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


联系我
置顶