springboot多数据源

我们在项目中有时为了方便,会使用过数据源来做一些复杂业务逻辑,本文主要讲解项目中多数据源的配置

1. DataSource、SqlSession、SqlSessionFactory

在springmvc 或者springboot中,数据库的操作主要是通过SqlSession来完成,而SqlSession 是通过SqlSessionFactory来build的,SqlSessionFactory又依赖于DataSource,由此我们可以在项目中创建多个DataSource、SqlSession、SqlSessionFactory 来区分不同的数据源

例如

  数据源A 包含  DataSourceA ,SqlSessionA,SqlSessionFactoryA

  数据源B 包含  DataSourceB ,SqlSessionB,SqlSessionFactoryB

  ......

  每个SqlSessionFactory绑定不同的xml,SqlSession绑定不同的mapper,这样就能根据不同的mapper映射自动选择不同的数据源

 

2.实战

数据源A

@Configuration
@MapperScan(basePackages = "com.example.mapper.a", sqlSessionTemplateRef = "aSqlSessionTemplate")
public class DataSourceAConfig {

    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;
    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;

    @Bean(name = "aDataSource")
    public DataSource aDataSource() throws SQLException {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setFilters("stat");
        return dataSource;
    }

    @Bean(name = "aSqlSessionFactory")
    public SqlSessionFactory aSqlSessionFactory(@Qualifier("aDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        Properties properties = new Properties();
        properties.setProperty("reasonable", "true");
        properties.setProperty("supportMethodsArguments", "true");
        properties.setProperty("returnPageInfo", "check");
        properties.setProperty("params", "count=countSql");
 
        properties.setProperty("reasonable", "false");
        // 添加插件
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/a/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "aTransactionManager")
    public DataSourceTransactionManager atTransactionManager(@Qualifier("aDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "aSqlSessionTemplate")
    public SqlSessionTemplate aSqlSessionTemplate(@Qualifier("aSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

数据源B

@Configuration
@MapperScan(basePackages = "com.example.mapper.b", sqlSessionTemplateRef = "bSqlSessionTemplate")
public class DataSourceBConfig {

    @Value("${spring.datasource.url}")
    private String url;
    @Value("${spring.datasource.username}")
    private String username;
    @Value("${spring.datasource.password}")
    private String password;
    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;

    @Bean(name = "bDataSource")
    public DataSource bDataSource() throws SQLException {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClassName);
        dataSource.setUrl(url);
        dataSource.setUsername(username);
        dataSource.setPassword(password);
        dataSource.setFilters("stat");
        return dataSource;
    }

    @Bean(name = "bSqlSessionFactory")
    public SqlSessionFactory aSqlSessionFactory(@Qualifier("bDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        Properties properties = new Properties();
        properties.setProperty("reasonable", "true");
        properties.setProperty("supportMethodsArguments", "true");
        properties.setProperty("returnPageInfo", "check");
        properties.setProperty("params", "count=countSql");
 
        properties.setProperty("reasonable", "false");
        // 添加插件
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mybatis/b/*.xml"));
        return bean.getObject();
    }

    @Bean(name = "bTransactionManager")
    public DataSourceTransactionManager atTransactionManager(@Qualifier("bDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "bSqlSessionTemplate")
    public SqlSessionTemplate aSqlSessionTemplate(@Qualifier("bSqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

通过这样配置后,a包下的mapper走aDatasource,b包下的mapper走bDatasource

 

posted @ 2021-06-29 10:49  山顶上的蜗牛  阅读(1221)  评论(0)    收藏  举报