3

spring boot双数据源操作记录

 2 years ago
source link: http://www.hechunbo.com/index.php/archives/409.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

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,"","");
    }

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK