1.背景

因新项目对旧系统业务的重构,原有业务也只有单一数据源。项目开发到后期,现场存在历史数据迁移问题,在讨论后希望系统支持多数源的方式解决对历史数据同步调用的问题。项目的配置文件为nacos配置,涉及多个现场的升级部署,因此希望改动影响尽可能小。

2.方案

  1. 配置文件在原数据库配置下直接再增加第二个数据源配置
spring:
 # 数据源配置
  datasource: # 数据源1
      driver-class-name: com.mysql.jdbc.Driver 
      url: jdbc:mysql://localhost:3306/db
      username: root 
      password: 123456 
    database: # 数据源2
      driver-class-name: com.mysql.jdbc.Driver 
      url: jdbc:mysql://localhost:3307/database#数据源地址
      username: root   # 用户名
      password: 123456 # 密码

     2.代码中配置 

/**
 * 多数据源配置
 */
@Configuration
@MapperScan(basePackages = "数据源1Mapper类文件包路径", sqlSessionFactoryRef = "priSqlSessionFactory")
public class DataSourceConfig {

    @Bean(name = "dataSourcePri")
    @ConfigurationProperties(prefix = "spring.datasource")  // 数据源1的配置前缀  数据源2这里 spring.datasource.database
    public DataSource getDateSource() {
        return DataSourceBuilder.create().build();
    }



   /**
     * DataSource注入sqlSessionFactory
     */
    @Bean(name = "priSqlSessionFactory")
    public SqlSessionFactory memberSqlSessionFactory(@Qualifier("dataSourcePri") DataSource datasource) throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        //注入数据源
        bean.setDataSource(datasource);
        bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath*:mapper/**/*.xml"));
        return bean.getObject();
    }

    /**
     * SqlSessionFactory注入SqlSessionTemplate方法
     */
    @Bean("priSqlSessionTemplate")
    public SqlSessionTemplate memberSqlSessionTemplate(@Qualifier("priSqlSessionFactory") SqlSessionFactory sessionFactory) {
        return new SqlSessionTemplate(sessionFactory);
    }

}

上面为数据源1的配置,数据源2的配置和上面配置类似

3.总结

先说明一下这样写的原因,不改动之前的数据配置,减少现场实施操作失误。

原先springboot是支持数据源的AutoConfig的 改成多数据源需要手动配置Configuration

踩坑: 1. bean.setMapperLocations 这里设置mybatis的扫包路径,一开始没有注意到这里的Locations是加's' 导致后面报Mapper.xml文件不存在

            2. classpath*:mapper/**/*.xml  解释一下 classpath* 和 classpath 的区别 带*号扫描当前模块还有其他jar包的根路径 。

            3. 这里也引入几个问题 分页插件失效 ,数据库字段名下划线未转换驼峰。 可以通过SqlSessionFactoryBean 的创建过程中配置相应config。失效原因也是源于Springboot 的AutoConfig配置类@ConditionalOnMissingBean 

            4. 事务问题 在访问A数据库的Service调用了B数据库如果发生异常,会有报错,这里需要要按分布式事务配置。

有兴趣的也可以研究一下 DynamicDataSource 

    

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐