springboot配置兩個mysql資料來源
阿新 • • 發佈:2019-05-09
參考: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會優先選擇