项目集成多个数据源

项目目前情况是mysql查询,需要添加clickhouse查询
需要多数据源
于是对项目改造如下

@Configuration
//配置maapper类的扫描路径,执行对应的mapper类方法时才可以使用合适的datasource
@MapperScan(value = "扫描路径",sqlSessionFactoryRef = "clickSqlSessionFactory")
public class ClickDataSourceConfig extends DataSourceConfig{
    @Value("属性注入")
    private String       url;
 @Value("属性注入")
    private String       username;
 @Value("属性注入")
    private String       password;
     @Value("属性注入")
    private String       driverclassname;
    @Bean(name="clickHouseDataSource")
    public DataSource clickHouseDataSource() {
        return DataSourceBuilder.create().driverClassName(driverclassname).url(url)
                .username(username).password(password).build();
    }
    @Bean(name = "clickSqlSessionFactory")
    public SqlSessionFactory clickHouseSqlSessionFactoryBean(@Qualifier("clickHouseDataSource")DataSource dataSource) throws Exception {
        SqlSessionFactoryBean factory=new SqlSessionFactoryBean();
        factory.setDataSource(dataSource);
        //配置实体类路径,方便做对象和数据库记录的关联
        factory.setTypeAliasesPackage("");
        ResourcePatternResolver resourcePatternResolver=new PathMatchingResourcePatternResolver();
        //配置mapper.xml文件的路径
        factory.setMapperLocations(resourcePatternResolver.getResources("classpath:clickhouse/*.xml"));
        //开启驼峰命名的转换
      //  factory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
        return factory.getObject();
    }
}


@Configuration
@MapperScan(value = "",sqlSessionFactoryRef = "mysqlSqlSessionFactory")
public class MysqlDataSourceConfig  extends DataSourceConfig{
    @Value("属性注入")
    private String       url;
 @Value("属性注入")
    private String       username;
 @Value("属性注入")
    private String       password;
     @Value("属性注入")
    private String       driverclassname;
    @Bean(name="mysqlDataSource")
    @Primary
    public DataSource mysqlDataSource() {
        return DataSourceBuilder.create().driverClassName(driverclassname).url(url)
                .username(username).password(password).build();
    }
    @Bean(name = "mysqlSqlSessionFactory")
    @Primary
    public SqlSessionFactory mysqlSqlSessionFactoryBean(@Qualifier("mysqlDataSource") DataSource dataSource)throws Exception{
        SqlSessionFactoryBean factory=new SqlSessionFactoryBean();
        factory.setConfiguration(mybatisConfiguration());
        factory.setDataSource(dataSource);
        factory.setTypeAliasesPackage("");
        ResourcePatternResolver resourcePatternResolver=new PathMatchingResourcePatternResolver();
        factory.setMapperLocations(resourcePatternResolver.getResources("classpath:mapper/*.xml"));
        //factory.getObject().getConfiguration().setMapUnderscoreToCamelCase(true);
        return factory.getObject();
    }
    @Bean
    public org.apache.ibatis.session.Configuration mybatisConfiguration() {
        org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();

        // 配置类型别名
        configuration.getTypeAliasRegistry().registerAlias("page", com.reformer.commons.bo.Page.class);

        return configuration;
    }

public class DataSourceConfig {


}


下面的问题就是如何切换数据源做查询了
这里可以使用切面 加注解的方式实现


import com.rfca.config.ClickDataSourceConfig;
import com.rfca.datasource.DynamicDataSource;
import com.rfca.datasource.MutilDataSourceContextHolder;
import org.aspectj.lang.annotation.After;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Aspect
@Order(1)
@Component
public class ClickHouseDataSourceAspect {

    @Pointcut("@annotation(com.rfca.anno.UseClickHouseDataSource)")
    public void useClickHouseDataSourcePointcut() {
    }

    @Before("useClickHouseDataSourcePointcut()")
    public void setClickHouseDataSource() {
        MutilDataSourceContextHolder.setDataSourceConfig(new ClickDataSourceConfig());
    }
    @After("useClickHouseDataSourcePointcut()")
    public void clear() {
        MutilDataSourceContextHolder.clearDataSourceConfig();
    }
}

注解

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface UseClickHouseDataSource {
}

方法加上注解

    @UseClickHouseDataSource
    ParkingRecord selectByPrimaryKey(Long id);

然后在项目中使用

  CkParkingRecordMapper ckParkingRecordMapper = (CkParkingRecordMapper) SpringContextHolder.getBean("ckParkingRecordMapper");          ckParkingRecordMapper.selectByPrimaryKey(1L);

其他类


import com.rfca.config.DataSourceConfig;

public class MutilDataSourceContextHolder {
    private static ThreadLocal<DataSourceConfig> contextHolder = new ThreadLocal<>();

    public static void setDataSourceConfig(DataSourceConfig config) {
        contextHolder.set(config);
    }

    public static DataSourceConfig getDataSourceConfig() {
        return contextHolder.get();
    }

    public static void clearDataSourceConfig() {
        contextHolder.remove();
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

晴天M雨天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值