springcloud中配置多數據源


1、mybatis多數據源的使用場景:
操作同一台服務器上不同的數據庫,或者多地機器上的相同或不相同數據庫。
進行跨庫操作、多數據源進行分離數據;
使得程序得以擴展,當一台或者部分服務器宕機,不影響整個應用的服務;
2、多數據源配置的思路:
數據隔離,把數據分別存放在test、test02這兩個數據庫中;
創建數據源Datasource指定使用的哪個數據源配置,並將其注入到SqlSessionFactory 會話工廠;
創建事務TransactionManager,需把數據源注入;
把SqlSessionFactory 注入,創建sqlSessionTemplate模板,使用模板操作mapper接口;
把模板放到mapper 路徑下,並 @MapperScan注解 聲明mapper接口位置;

1,在application.yml中配置兩個數據源的信息

#配置多數據源
spring.datasource.iam.jdbc-url: jdbc:mysql://localhost:3306/iam
spring.datasource.iam.username: root
spring.datasource.iam.password: root
spring.datasource.iam.driver-class-name: com.mysql.cj.jdbc.Driver

spring.datasource.appstore.jdbc-url: jdbc:mysql://localhost:3306/appstore
spring.datasource.appstore.username: root
spring.datasource.appstore.password: root
spring.datasource.appstore.driver-class-name: com.mysql.cj.jdbc.Driver

2,創建並配置兩個數據源的datasourceConfig
2.1 iamDataSourceConfig配置

/**
 * 創建iam庫的數據源
 */
@Configuration
@MapperScan(basePackages = "com.primeton.tags.mapper.iam",sqlSessionTemplateRef = "iamSqlSessionTemplate")
public class IamDataSourceConfig {

    /**
     * 加載配置數據源
     * @return
     * @Primary 是指具有默認值
     */
    @Bean(name="iamDataSource")    //作用在方法上,注入;一般和@Qualifier配合使用
    @ConfigurationProperties(prefix = "spring.datasource.iam")   //指定加載哪個數據庫配置
    @Primary   //是指默認值,多個數據源只能存在一個默認值,及僅能一個數據源使用該注解
    public DataSource iamDataSource() {
        return DataSourceBuilder.create().build();
    }

    /**
     * 創建會話工廠SqlSessionFactory
     * @param dataSource
     * @return
     * @throws Exception
     */
    @Bean(name="iamSqlSessionFactory")
    @Primary
    public SqlSessionFactory iamSqlSessionFactory(@Qualifier("iamDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setTypeAliasesPackage("com.primeton.tags.entity");   //設置mybatis別名
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/iam/*.xml"));
        return sqlSessionFactoryBean.getObject();
    }

    /**
     * 創建事務 TransactionManager
     * @param dataSource
     * @return
     */
    @Bean(name="iamTransactionManager")
    @Primary
    public DataSourceTransactionManager testTransactionManager(@Qualifier("iamDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    /**
     * 創建SqlSessionTemplate模版
     * @param sqlSessionFactory
     * @return
     */
    @Bean(name="iamSqlSessionTemplate")
    @Primary
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("iamSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

2.2 AppstoreDataSourceConfig配置

@Configuration
@MapperScan(basePackages = "com.primeton.tags.mapper.appstore",sqlSessionTemplateRef = "appstoreSqlSessionTemplate")
public class AppstoreDataSourceConfig {

    @Bean(name="appstoreDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.appstore")
    public DataSource appstoreDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name="appstoreSqlSessionFactory")
    public SqlSessionFactory appstoreSqlSessionFactory(@Qualifier("appstoreDataSource") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setTypeAliasesPackage("com.primeton.tags.entity");
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/appstore/*.xml"));
        return sqlSessionFactoryBean.getObject();
    }

    @Bean(name="appstoreTransactionManager")
    public DataSourceTransactionManager testTransactionManager(@Qualifier("appstoreDataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name="appstoreSqlSessionTemplate")
    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("appstoreSqlSessionFactory") SqlSessionFactory sqlSessionFactory){
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

3,編寫mapper接口和對應的xml(跟單庫時一樣);

@Mapper
public interface TagMapper {
    List<Tag> selectAllTag();
}
<mapper namespace="com.primeton.tags.mapper.iam.TagMapper">
    <select id="selectAllTag" resultType="tag">
        select
            *
        from tag_tb t
    </select>
</mapper>

4,單元測試

@SpringBootTest
public class MultiDataSourceTest {
    @Autowired
    private TagMapper tagMapper;
    @Autowired
    private Tag2Mapper tag2Mapper;

    @Test
    public void testSelectAll() {
        List<Tag> tagList = tagMapper.selectAllTag();
        List<Tag> tag2List = tag2Mapper.selectAllTag();
        System.out.println("tagList:"+tagList);
        System.out.println("tag2List:"+tag2List);
    }
}

開發中遇到的問題:

1,使用多數據源后別名失效;

博客:https://blog.csdn.net/xiaoxiao48/article/details/105725009

解決辦法:在多數據源的配置中設置別名:

sqlSessionFactoryBean.setTypeAliasesPackage("com.primeton.tags.entity");   //設置mybatis別名

2,使用多數據源后mybatis日志失效:

博客:https://blog.csdn.net/qq_40791070/article/details/100665502
解決辦法:
1,在yml中添加mybatis日志配置

mybatis:
  configuration:
    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl

2,在某一個自定義的多數據源配置中進行配置;
注意:不能在每個多數據源配置中都添加,否則會報錯。

  @Bean(name="iamSqlSessionFactory")
    @Primary
    public SqlSessionFactory iamSqlSessionFactory(@Qualifier("iamDataSource") DataSource dataSource, MybatisProperties mybatisProperties) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setTypeAliasesPackage("com.primeton.tags.entity");   //設置mybatis別名
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/iam/*.xml"));
      sqlSessionFactoryBean.setConfiguration(mybatisProperties.getConfiguration());
        return sqlSessionFactoryBean.getObject();
    }

3,在配置了多數據源后,mybatis-plus分頁功能失效

博客:https://blog.csdn.net/qq_22008739/article/details/88885732
解決辦法:集成多數據源的時候需要手動配置分頁插件
3.1 mybatis-plus分頁配置

@Configuration
public class MybatisPlusConfig {
    @Bean
    public PaginationInterceptor paginationInterceptor() {
        return new PaginationInterceptor();
    }
}

3.2 在多數據源配置中進行配置

    @Bean(name="iamSqlSessionFactory")
    @Primary
    public SqlSessionFactory iamSqlSessionFactory(@Qualifier("iamDataSource") DataSource dataSource, MybatisProperties mybatisProperties) throws Exception {

            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        sqlSessionFactoryBean.setTypeAliasesPackage("com.primeton.tags.entity");   //設置mybatis別名
        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/iam/*.xml"));
        sqlSessionFactoryBean.setConfiguration(mybatisProperties.getConfiguration());  //配置多數據源后打印日志
        MybatisConfiguration config = new MybatisConfiguration();
        config.addInterceptor(new PaginationInterceptor());
        sqlSessionFactoryBean.setConfiguration(config);   //解決配置多數據源后mybatis-plus分頁失效問題
        return sqlSessionFactoryBean.getObject();
    }

 

 

1,在application.yml中配置兩個數據源的信息
#配置多數據源spring.datasource.iam.jdbc-url: jdbc:mysql://localhost:3306/iamspring.datasource.iam.username: rootspring.datasource.iam.password: rootspring.datasource.iam.driver-class-name: com.mysql.cj.jdbc.Driver
spring.datasource.appstore.jdbc-url: jdbc:mysql://localhost:3306/appstorespring.datasource.appstore.username: rootspring.datasource.appstore.password: rootspring.datasource.appstore.driver-class-name: com.mysql.cj.jdbc.Driver123456789102,創建並配置兩個數據源的datasourceConfig2.1 iamDataSourceConfig配置
/** * 創建iam庫的數據源 */@Configuration@MapperScan(basePackages = "com.primeton.tags.mapper.iam",sqlSessionTemplateRef = "iamSqlSessionTemplate")public class IamDataSourceConfig {
    /**     * 加載配置數據源     * @return     * @Primary 是指具有默認值     */    @Bean(name="iamDataSource")    //作用在方法上,注入;一般和@Qualifier配合使用    @ConfigurationProperties(prefix = "spring.datasource.iam")   //指定加載哪個數據庫配置    @Primary   //是指默認值,多個數據源只能存在一個默認值,及僅能一個數據源使用該注解    public DataSource iamDataSource() {        return DataSourceBuilder.create().build();    }
    /**     * 創建會話工廠SqlSessionFactory     * @param dataSource     * @return     * @throws Exception     */    @Bean(name="iamSqlSessionFactory")    @Primary    public SqlSessionFactory iamSqlSessionFactory(@Qualifier("iamDataSource") DataSource dataSource) throws Exception {        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();        sqlSessionFactoryBean.setDataSource(dataSource);        sqlSessionFactoryBean.setTypeAliasesPackage("com.primeton.tags.entity");   //設置mybatis別名        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/iam/*.xml"));        return sqlSessionFactoryBean.getObject();    }
    /**     * 創建事務 TransactionManager     * @param dataSource     * @return     */    @Bean(name="iamTransactionManager")    @Primary    public DataSourceTransactionManager testTransactionManager(@Qualifier("iamDataSource") DataSource dataSource) {        return new DataSourceTransactionManager(dataSource);    }
    /**     * 創建SqlSessionTemplate模版     * @param sqlSessionFactory     * @return     */    @Bean(name="iamSqlSessionTemplate")    @Primary    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("iamSqlSessionFactory") SqlSessionFactory sqlSessionFactory){        return new SqlSessionTemplate(sqlSessionFactory);    }}
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657582.2 AppstoreDataSourceConfig配置
@Configuration@MapperScan(basePackages = "com.primeton.tags.mapper.appstore",sqlSessionTemplateRef = "appstoreSqlSessionTemplate")public class AppstoreDataSourceConfig {
    @Bean(name="appstoreDataSource")    @ConfigurationProperties(prefix = "spring.datasource.appstore")    public DataSource appstoreDataSource() {        return DataSourceBuilder.create().build();    }
    @Bean(name="appstoreSqlSessionFactory")    public SqlSessionFactory appstoreSqlSessionFactory(@Qualifier("appstoreDataSource") DataSource dataSource) throws Exception {        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();        sqlSessionFactoryBean.setDataSource(dataSource);        sqlSessionFactoryBean.setTypeAliasesPackage("com.primeton.tags.entity");        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/appstore/*.xml"));        return sqlSessionFactoryBean.getObject();    }
    @Bean(name="appstoreTransactionManager")    public DataSourceTransactionManager testTransactionManager(@Qualifier("appstoreDataSource") DataSource dataSource) {        return new DataSourceTransactionManager(dataSource);    }
    @Bean(name="appstoreSqlSessionTemplate")    public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("appstoreSqlSessionFactory") SqlSessionFactory sqlSessionFactory){        return new SqlSessionTemplate(sqlSessionFactory);    }}12345678910111213141516171819202122232425262728293,編寫mapper接口和對應的xml(跟單庫時一樣);
@Mapperpublic interface TagMapper {    List<Tag> selectAllTag();}1234<mapper namespace="com.primeton.tags.mapper.iam.TagMapper">    <select id="selectAllTag" resultType="tag">        select            *        from tag_tb t    </select></mapper>12345674,單元測試
@SpringBootTestpublic class MultiDataSourceTest {    @Autowired    private TagMapper tagMapper;    @Autowired    private Tag2Mapper tag2Mapper;
    @Test    public void testSelectAll() {        List<Tag> tagList = tagMapper.selectAllTag();        List<Tag> tag2List = tag2Mapper.selectAllTag();        System.out.println("tagList:"+tagList);        System.out.println("tag2List:"+tag2List);    }}123456789101112131415開發中遇到的問題:
1,使用多數據源后別名失效;博客:https://blog.csdn.net/xiaoxiao48/article/details/105725009
解決辦法:在多數據源的配置中設置別名:
sqlSessionFactoryBean.setTypeAliasesPackage("com.primeton.tags.entity");   //設置mybatis別名12,使用多數據源后mybatis日志失效:博客:https://blog.csdn.net/qq_40791070/article/details/100665502解決辦法:1,在yml中添加mybatis日志配置
mybatis:  configuration:    log-impl: org.apache.ibatis.logging.stdout.StdOutImpl1232,在某一個自定義的多數據源配置中進行配置;注意:不能在每個多數據源配置中都添加,否則會報錯。
  @Bean(name="iamSqlSessionFactory")    @Primary    public SqlSessionFactory iamSqlSessionFactory(@Qualifier("iamDataSource") DataSource dataSource, MybatisProperties mybatisProperties) throws Exception {        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();        sqlSessionFactoryBean.setDataSource(dataSource);        sqlSessionFactoryBean.setTypeAliasesPackage("com.primeton.tags.entity");   //設置mybatis別名        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/iam/*.xml"));      sqlSessionFactoryBean.setConfiguration(mybatisProperties.getConfiguration());        return sqlSessionFactoryBean.getObject();    }123456789103,在配置了多數據源后,mybatis-plus分頁功能失效
博客:https://blog.csdn.net/qq_22008739/article/details/88885732解決辦法:集成多數據源的時候需要手動配置分頁插件3.1 mybatis-plus分頁配置
@Configurationpublic class MybatisPlusConfig {    @Bean    public PaginationInterceptor paginationInterceptor() {        return new PaginationInterceptor();    }}12345673.2 在多數據源配置中進行配置
    @Bean(name="iamSqlSessionFactory")    @Primary    public SqlSessionFactory iamSqlSessionFactory(@Qualifier("iamDataSource") DataSource dataSource, MybatisProperties mybatisProperties) throws Exception {
            SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();        sqlSessionFactoryBean.setDataSource(dataSource);        sqlSessionFactoryBean.setTypeAliasesPackage("com.primeton.tags.entity");   //設置mybatis別名        sqlSessionFactoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/iam/*.xml"));        sqlSessionFactoryBean.setConfiguration(mybatisProperties.getConfiguration());  //配置多數據源后打印日志        MybatisConfiguration config = new MybatisConfiguration();        config.addInterceptor(new PaginationInterceptor());        sqlSessionFactoryBean.setConfiguration(config);   //解決配置多數據源后mybatis-plus分頁失效問題        return sqlSessionFactoryBean.getObject();    }————————————————版權聲明:本文為CSDN博主「qiaosaifei」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。原文鏈接:https://blog.csdn.net/qiaosaifei/article/details/117743659


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM