springboot&資料庫連線池&切面動態資料來源
阿新 • • 發佈:2020-07-26
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()