背景

电极故障智能巡检系统需要和客户巡检系统对接,本来对接的方案是通过共享数据库的方式解决,因此我一开始设计的方案是通过设置触发器自动新增故障数据到我方业务数据库。后来领导因为种种原因逼迫我采用轮询方式处理,只好想办法在业务这边增加一个数据源,通过定时任务拉取数据并进行相关同步。

参考资料

情况不明,百度先行,先看看有没有相关的文档可供参考。(肯定是有的),如下所示:

实践过程

基本上仿照第一篇博客的内容,做了一点适配性的修改。

Step1:修改配置文件

  1. spring:
  2. datasource:
  3. ds1:
  4. url: jdbc:mysql://192.168.100.5:3307/fault_dev?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
  5. username: wallet
  6. password: test123
  7. ds2:
  8. url: jdbc:mysql://192.168.100.5:3307/fault_test?useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghai
  9. username: wallet
  10. password: test123

Step2:Springboot配置类

目的是映射配置文件 @Configuration

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;

import javax.sql.DataSource;

/**
 * 多数据源配置
 *
 * @author Paradise
 */
@Configuration
public class DataSourceConfig {

    @Primary
    @Bean(name = "dataSourceProperties1")
    @ConfigurationProperties(prefix = "spring.datasource.ds1")
    public DataSourceProperties dataSourceProperties1() {
        return new DataSourceProperties();
    }

    @Primary
    @Bean(name = "dataSource1")
    public DataSource dataSource1(@Qualifier("dataSourceProperties1") DataSourceProperties dataSourceProperties) {
        return dataSourceProperties.initializeDataSourceBuilder().build();
    }

    @Bean(name = "dataSourceProperties2")
    @ConfigurationProperties(prefix = "spring.datasource.ds2")
    public DataSourceProperties dataSourceProperties2() {
        return new DataSourceProperties();
    }

    @Bean(name = "dataSource2")
    public DataSource dataSource2(@Qualifier("dataSourceProperties2") DataSourceProperties dataSourceProperties) {
        return dataSourceProperties.initializeDataSourceBuilder().build();
    }
}

Step3:JdbcTemplate多数据源配置

import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.core.JdbcTemplate;

import javax.sql.DataSource;

/**
 * @author Paradise
 */
@Configuration
public class JdbcTemplateDataSourceConfig {

    @Primary
    @Bean(name = "jdbcTemplate1")
    public JdbcTemplate jdbcTemplate1(@Qualifier("dataSource1") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }

    @Bean(name = "jdbcTemplate2")
    public JdbcTemplate jdbcTemplate2(@Qualifier("dataSource2") DataSource dataSource) {
        return new JdbcTemplate(dataSource);
    }
}

Step4: mybatis 配置

每个数据源一个配置类,数据源2参考数据1进行配置, 记得去掉 @Primary注解;

package com.share.mining.web.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.Resource;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;

import javax.sql.DataSource;

/**
 * MyBatis配置类
 */
@Configuration
@EnableTransactionManagement
@MapperScan(basePackages = {"com.share.mining.mapper", "com.share.mining.dao"},
            sqlSessionFactoryRef = "ds1SqlSessionFactory")
public class MyBatisConfigDs1 {

    @Primary
    @Bean("ds1SqlSessionFactory")
    public SqlSessionFactory ds1SqlSessionFactory(@Qualifier("dataSource1") DataSource dataSource) throws Exception {
        SqlSessionFactoryBean sqlSessionFactoryBean = new SqlSessionFactoryBean();
        sqlSessionFactoryBean.setDataSource(dataSource);
        Resource[] resources = new PathMatchingResourcePatternResolver().
                getResources("classpath*:com/share/mining/**/*.xml");
        sqlSessionFactoryBean.setMapperLocations(resources);
        return sqlSessionFactoryBean.getObject();
    }

    @Primary
    @Bean(name = "ds1TransactionManager")
    public DataSourceTransactionManager ds1TransactionManager(@Qualifier("dataSource1") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Primary
    @Bean(name = "ds1SqlSessionTemplate")
    public SqlSessionTemplate ds1SqlSessionTemplate(@Qualifier("ds1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
        return new SqlSessionTemplate(sqlSessionFactory);
    }
}

Step5:一些修改项

  1. 去掉 @SpringBootApplication 启动类 上面的 @MapperScan 注解;
  2. _移动了 mining-mbg 包下的 dao 文件夹 到 mapper 文件夹下面,因为不知道 _setMapperLocations 如何配置两个文件夹;

遇到的问题

区分不同数据源的 mapper.xml 文件,sqlSessionFactoryBean.setMapperLocations(resources);