spring boot双数据源记录

1,添加配置文件

  1. MasterDataSourceConfig

    @Configuration
    // 扫描 Mapper 接口并容器管理
    @MapperScan(basePackages = MasterDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "masterSqlSessionFactory")
    public class MasterDataSourceConfig {

    // 精确到 master 目录,以便跟其他数据源隔离
    static final String PACKAGE = "com.xxx.xxx.xxx.dao.master";
    static final String MAPPER_LOCATION = "classpath:mapper/master/*.xml";
    
    @Value("${master.datasource.url}")
    private String url;
    
    @Value("${master.datasource.username}")
    private String user;
    
    @Value("${master.datasource.password}")
    private String password;
    
    @Value("${master.datasource.driverClassName}")
    private String driverClass;
    
    @Bean(name = "masterDataSource")
    @Primary
    public DataSource masterDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }
    
    @Bean(name = "masterTransactionManager")
    @Primary
    public DataSourceTransactionManager masterTransactionManager() {
        return new DataSourceTransactionManager(masterDataSource());
    }
    
    @Bean(name = "masterSqlSessionFactory")
    @Primary
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource masterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(masterDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(MasterDataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }

    }

2.SecondDataSourceConfig.java

注意这个第二个数据源中的mapperlocation 因为是引用其它jar包中的xml文件,所以要把classpath改为classpath*.

否则会报错

org.apache.ibatis.binding.BindingException: Invalid bound statement (not found):

@Configuration
// 扫描 Mapper 接口并容器管理
@MapperScan(basePackages = SecondDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "secondSqlSessionFactory")
public class SecondDataSourceConfig {

    // 精确到 cluster 目录,以便跟其他数据源隔离

    static final String PACKAGE = "com.xxx.xxx.xxx.mapper";
    static final String MAPPER_LOCATION = "classpath*:mapper/*.xml";

    @Value("${second.datasource.url}")
    private String url;

    @Value("${second.datasource.username}")
    private String user;

    @Value("${second.datasource.password}")
    private String password;

    @Value("${second.datasource.driverClassName}")
    private String driverClass;

    @Bean(name = "secondDataSource")
    public DataSource clusterDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean(name = "secondTransactionManager")
    public DataSourceTransactionManager clusterTransactionManager() {
        return new DataSourceTransactionManager(clusterDataSource());
    }

    @Bean(name = "secondSqlSessionFactory")
    public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("secondDataSource") DataSource clusterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(clusterDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(SecondDataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }
}

启动类更改

要注意三个地方的更改.

1 @SpringBootApplication s要加上exclue排除自动配置

2.@MapperScan 要加上第二个dao所在的位置. xml接口

@MapperScan({"com.xxx.xxx.xxx.dao","com.xxx.xxx.xxx1.dao"})
@ComponentScan(basePackages = { "com.xxx.xxx.xxx", "com.xxx.xxx.common","com.xxx.xxx.xxx1.mapper"})
@SpringBootApplication(exclude = {DataSourceAutoConfiguration.class})
public class xxxApplication {
    public static void main(String[] args) {
        SpringApplication.run(FinanicalInformationApplication.class, args);
        System.out.println("start success ");
    }

}

直接调用

  public Result GetProductList(@RequestBody Integer userId){
        TblCfp entity=tblCfpDao.queryById(1); //第一个库
        List<MFundInfo> fundInfos=tblFundInfoDAO.selectAll(1,100); //第二个库.
        return Results.successWithData(fundInfos,"","");
    }

本文由 hcb 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

还不快抢沙发

添加新评论