您的位置 首页 java

SpringBoot整合多数据源

前段时间,与别的厂家进行接口联调时,接口地址的URL、参数、调用方式等信息存放在SQLite数据库里,通过接口地址获取的数据需要保存在 mysql 数据库中,因此需要多数据源的支持。

特此,记录一下[做鬼脸]

美好的一天,从敲代码开始…

首先:

对数据库进行配置,仅涉及重要设置,其余配置不再赘述

 spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    master: # 主数据源
      url: jdbc:sqlite:E:XXXConfigrationMachine.db
      username:
      password:
      driver-class-name: org.sqlite.JDBC
    slave: # 从数据源
      url: jdbc: MySQL ://ip:port/test?allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=GMT%2B8
      username: root
      password: root
      driver-class-name: com.mysql.cj.jdbc.Driver  

本次主数据源为SQLite,从数据源为MySQL,大家根据具体的场景而定。

然后:

主数据源Java配置类

 import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.Sql sessionFactory ;
import org. mybatis .spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotat io n.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

/**
 * @日期: 2020/12/31
 * @作者: dd
 * @描述: 主数据源
 */@Configuration
@MapperScan(basePackages = MasterSourceConfig.PACKAGE,sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterSourceConfig {

    // 精确到 mapper 目录,以便跟其他数据源隔离
    static final String PACKAGE = "com.xxx. dao .master";
    static final String MAPPER_LOCATION = "classpath:mybatis/*.xml";

    @Value("${spring.datasource.master.url}")
    private String url;

    @Value("${spring.datasource.master.username}")
    private String user;

    @Value("${spring.datasource.master.password}")
    private String password;

    @Value("${spring.datasource.master.driver-class-name}")
    private String driverClass;

    /**
     * Primary 注解必须加,表明这是一个主数据源
     */
    @Bean(name = "masterDataSource")
    @Primary
    public DataSource masterDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean(name = "masterTransactionManager")
    @Primary
    public DataSourceTransactionManager masterTransactionManager() {
        return new DataSourceTransactionManager(masterDataSource());
    }

    @Bean(name = "masterSqlSessionFactory")
    @Primary
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource)
            throws Exception {

        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();

        sessionFactory.setDataSource(dataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                      .getResources(MasterSourceConfig.MAPPER_LOCATION));

        return sessionFactory.getObject();

    }

}  

从数据源:java配置类

 import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

/**
 * @日期: 2020/12/31
 * @作者: dd
 * @描述: 从数据源
 */@Configuration
@MapperScan(basePackages = SlaveSourceConfig.PACKAGE,sqlSessionFactoryRef = "slaveSqlSessionFactory")
public class SlaveSourceConfig {

    // 精确到 mapper 目录,以便跟其他数据源隔离
    static final String PACKAGE = "com.xxx.dao.slave";
    static final String MAPPER_LOCATION = "classpath:mybatis/*.xml";

    @Value("${spring.datasource.slave.url}")
    private String url;

    @Value("${spring.datasource.slave.username}")
    private String user;

    @Value("${spring.datasource.slave.password}")
    private String password;

    @Value("${spring.datasource.slave.driver-class-name}")
    private String driverClass;

    @Bean(name = "slaveDataSource")
    public DataSource masterDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(driverClass);
        dataSource.setUrl(url);
        dataSource.setUsername(user);
        dataSource.setPassword(password);
        return dataSource;
    }

    @Bean(name = "slaveTransactionManager")
    public DataSourceTransactionManager masterTransactionManager() {
        return new DataSourceTransactionManager(masterDataSource());
    }

    @Bean(name = "slaveSqlSessionFactory")
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource)
            throws Exception {

        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();

        sessionFactory.setDataSource(dataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                      .getResources(SlaveSourceConfig.MAPPER_LOCATION));

        return sessionFactory.getObject();

    }

}  

最后:在dao层文件夹下建立master目录和slave目录,主数据源相关接口放置在master中,从数据源接口放置在slave中。

需要特别注意的一点:java配置类里的

static final String PACKAGE = “com.xxx.dao.slave”;

static final String PACKAGE = “com.xxx.dao.master”;

这些包,一定要对应起来,否则会扫描不到。

这样,从service注入不同数据源的mapper时,就可以分别使用不同的数据源啦!

今天的分享就到这里啦,喜欢小编的给个关注[比心]

【公众号】:Java点滴

文章来源:智云一二三科技

文章标题:SpringBoot整合多数据源

文章地址:https://www.zhihuclub.com/192950.shtml

关于作者: 智云科技

热门文章

网站地图