springboot项目部署双数据源


首先在说明一下在开发中遇到的场景,项目中需要扫描oracle的数据库,是做的分批次扫描,所以需要将扫描的最后的坐标也就是id或者时间戳之类的存入另一个小型的数据库中,也就是H2中。在下一次扫描时取出坐标,作为oracle查询条件进行扫描

1、导入maven依赖坐标,分别为Oracle,H2,动态数据源baomidou       

官网文档地址:https://baomidou.gitee.io/dynamic-datasource-doc/

            com.oracle
            ojdbc6
            11.2.0.3
         
        
            com.h2database
            h2
            ${h2.version}
        

        
            com.h2database
            connector
            1.0.0
        

          
         
          com.alibaba
          druid-spring-boot-starter
          1.1.10
         

     
        
            com.baomidou
            dynamic-datasource-spring-boot-starter
            2.4.2
        

2、主数据源yml配置

  datasource:
    dynamic:
      primary: master
      datasource:
        master:
          username: system
          password: 123456
          driver-class-name: oracle.jdbc.driver.OracleDriver
          url: jdbc:oracle:thin:@127.0.0.1:1521:orcl

3、从数据源yml配置

  datasource:
    dynamic:
      datasource:
        slave:
          username: root
          password: root
          driver-class-name: org.h2.Driver
          url: jdbc:h2:~/test

4、最后在服务层实现中添加@DS注解类区分主从数据源

@Service
@DS("master")
public class OrgServiceImpl implements OrgService {

    @Autowired
    DataMapper dataMapper;

    public List> selectAllMysql(String initId, String cols,String table,String schema,String pk,String rows) {
        return dataMapper.selectAllMysql(initId, cols,table,schema,pk,rows);
    }

    public List> selectAllOrcle(String initId, String cols,String table,String schema,String pk,String rows) {
        return dataMapper.selectAllOrcle(initId,cols,table,schema,pk,rows);
    }



    @Override
    public List> selectMysqlByDateTime(String field, String timeField, String param, String startTime, String endTime, String schema, String table) {
        return dataMapper.selectMysqlByDateTime(field, timeField, param, startTime, endTime, schema, table);
    }

    @Override
    public List> selectMysqlByLongTime(String field, String timeField,
                                                           String param, Long startTime, Long endTime, String schema, String table) {
        return dataMapper.selectMysqlByLongTime(field, timeField, param, startTime, endTime, schema, table);
    }

    @Override
    public List> selectOracleByTimeStamp(String field, String timeField,
                                                             String param, String startTime, String endTime, String schema, String table) {
        return dataMapper.selectOracleByTimeStamp(field, timeField, param, startTime, endTime, schema, table);
    }

    @Override
    public List> selectOracleByNumber(String cols, String timeField, String initId, Long lastExeTime, Long nowTime, String schema, String table) {
        return dataMapper.selectOracleByNumber(cols, timeField, initId, lastExeTime, nowTime, schema, table);
    }

    @Override
    public Map selectById(Long id, String field) {
        return dataMapper.selectById(id, field);
    }

}
@Service
@DS("slave")
public class H2DbServiceImpl implements H2DbService {

    @Autowired
    DataMapper dataMapper;

    @Override
    public Agent selectAgentAll() {
        return dataMapper.selectAgentAll();
    }

    @Override
    public String selectInitId() {
        return dataMapper.selectInitId();
    }

    @Override
    public String selectSourceTime() {
        return dataMapper.selectSourceTime();
    }

    @Override
    public int updateInitId(String initId) {
        return dataMapper.updateInitId(initId);
    }

    @Override
    public int updateSourceTime(String sourceTime) {
        return dataMapper.updateSourceTime(sourceTime);
    }

    @Override
    public int insert(String initId) {
        return dataMapper.insertInitId(initId,System.currentTimeMillis());
    }
}