1. 程式人生 > >springboot配置兩個mysql資料來源

springboot配置兩個mysql資料來源

參考:https://www.jianshu.com/p/735852145580

maven依賴

<!-- Spring Boot Mybatis 依賴 -->
<dependency>
  <groupId>org.mybatis.spring.boot</groupId>
  <artifactId>mybatis-spring-boot-starter</artifactId>
  <version>1.2.0</version>
</dependency>

<!-- MySQL 連線驅動依賴 -->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>5.1.39</version>
</dependency>

<!-- Druid 資料連線池依賴 -->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.0.18</version>
</dependency>

在application.yml檔案中配置兩個資料來源;如

spring:
 datasource:
    url: jdbc:mysql://aaaaaaaaa/aaaaaaaaaa?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
    username: aaaaa
    password: aaaaaaaaaa
    driver-class-name: com.mysql.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource

改為:

spring:
  datasource:
    aaaa:
      url: jdbc:mysql://aaaaaaaaaaa/aaaaaaaa?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
      username: root
      password: aaaaaaaaa
      driver-class-name: com.mysql.jdbc.Driver
      type: com.alibaba.druid.pool.DruidDataSource
    bbbb:
      url: jdbc:mysql://bbbbbbbbbbbbbb/bbbbbbbb?useUnicode=true&characterEncoding=utf8&allowMultiQueries=true
      username: root
      password: bbbbbbb
      driver-class-name: com.mysql.jdbc.Driver
      type: com.alibaba.druid.pool.DruidDataSource

這一步沒什麼好說的,畢竟兩個資料來源肯定有兩套配置檔案,載入的時候區分就好。

application.yaml的話:

# master 資料來源配置
master.datasource.url=jdbc:mysql://localhost:3306/springbootdb?useUnicode=true&characterEncoding=utf8
master.datasource.username=root
master.datasource.password=321
master.datasource.driverClassName=com.mysql.jdbc.Driver

# second 資料來源配置
second.datasource.url=jdbc:mysql://localhost:3306/springbootdb_second?useUnicode=true&characterEncoding=utf8
second.datasource.username=root
second.datasource.password=321
second.datasource.driverClassName=com.mysql.jdbc.Driver

載入bean

第一個資料來源:

@Configuration
@MapperScan(basePackages = MasterDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDataSourceConfig {
 
    // 精確到 master 目錄,以便跟其他資料來源隔離
    static final String PACKAGE = "org.spring.springboot.dao.master";
    static final String MAPPER_LOCATION = "classpath:mapper/master/*.xml";
//這裡重點說一下,因為自己掉坑裡了,我是mapper資料夾下有兩個資料夾aa,bb,這裡必須填到具體的資料夾,如mapper/aa或mapper/bb
 
    @Value("${master.datasource.url}")
    private String url;
 
    @Value("${master.datasource.username}")
    private String user;
 
    @Value("${master.datasource.password}")
    private String password;
 
    @Value("${master.datasource.driverClassName}")
    private String driverClass;
 
    @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 masterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(masterDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(MasterDataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }
}

第二個資料來源SecondDataSourceConfig的配置如下:

@Configuration
// 掃描 Mapper 介面並容器管理
@MapperScan(basePackages = SecondDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "secondSqlSessionFactory")
public class SecondDataSourceConfig {

    // 精確到 cluster 目錄,以便跟其他資料來源隔離
    static final String PACKAGE = "com.springboot.dao.second";
    static final String MAPPER_LOCATION = "classpath:mapper/second/*.xml";

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

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

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

    @Value("${second.datasource.driverClassName}")
    private String driverClass;

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

    @Bean(name = "secondTransactionManager")
    public DataSourceTransactionManager clusterTransactionManager() {
        return new DataSourceTransactionManager(clusterDataSource());
    }

    @Bean(name = "secondSqlSessionFactory")
    public SqlSessionFactory clusterSqlSessionFactory(@Qualifier("secondDataSource") DataSource clusterDataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(clusterDataSource);
        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                .getResources(SecondDataSourceConfig.MAPPER_LOCATION));
        return sessionFactory.getObject();
    }
}


剩下的就沒啥了,博主講的很詳細,我說一下自己遇見的坑吧:

1,

static final String MAPPER_LOCATION = "classpath:mapper/second/*.xml";

我第一次這裡配的不詳細,我沒有配到了master/和second/,只配到mapper/,以為會自動向下掃描,結果並沒有。。。

2,@primary

DataSourceTransactionManager 
SqlSessionFactory 

都沒有加@primary或者都加了

結論:連個配置類只有一個類可以加,springboot會優先選擇