springcloud中配置多数据源

参考文章:https://www.pianshen.com/article/3415102997/
需求:项目中需要对两个数据库中的数据进行操作

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();
    }

4,配置多数据源后,从数据源的mapper接口报错

org.apache.ibatis.binding.BindingException Invalid bound statement (not found)
参考博客: https://blog.csdn.net/ryo1060732496/article/details/136345536
解决办法: 将从数据源的dao上的@Mapper去掉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值