目前業界操作數據庫的框架一般是 Mybatis,但在很多業務場景下,我們需要在一個工程里配置多個數據源來實現業務邏輯。在SpringBoot中也可以實現多數據源並配合Mybatis框架編寫xml文件來執行SQL。在SpringBoot中,配置多數據源的方式十分便捷,
下面開始上代碼:
在pom.xml文件中需要添加一些依賴
<!-- 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.properties 配置兩個數據源配置
# master 數據源配置
master:
datasource:
url: jdbc:sqlserver://localhost:1433;DatabaseName=RYAccountsDB
driver-class-name: com.microsoft.sqlserver.jdbc.SQLServerDriver
username: sa
password: sa!@123
initial-size: 1
min-idle: 1
max-active: 20
test-on-borrow: true
max-wait: 60000
time-between-eviction-runs-millis: 60000
min-evictable-idle-time-millis: 300000
validation-query: SELECT 1 FROM DUAL
test-While-Idle: true
test-on-return: false
pool-prepared-statements: false
max-pool-prepared-statement-per-connection-size: 20
filters: stat,wall,log4j,config
# second 數據源配置
second:
datasource:
url: jdbc:mysql://localhost:33306/game_score_log?serverTimezone=GMT&useUnicode=true&characterEncoding=utf8
username: root
password: 1q2w#E4r
driver-class-name: com.mysql.cj.jdbc.Driver
max-idle: 10
max-wait: 10000
min-idle: 5
initial-size: 5
#mybatis:
# type-aliases-package: com.cjrh.game_api.dao
# mapper-locations: classpath*:mapper/*.xml
server:
port: 7000
數據源配置
多數據源配置的時候注意,必須要有一個主數據源,即 MasterDataSourceConfig 配置
@Primary 標志這個 Bean 如果在多個同類 Bean 候選時,該 Bean 優先被考慮。「多數據源配置的時候注意,必須要有一個主數據源,用 @Primary 標志該 Bean
@MapperScan 掃描 Mapper 接口並容器管理,包路徑精確到 master,為了和下面 cluster 數據源做到精確區分
@Value 獲取全局配置文件 application.properties 的 kv 配置,並自動裝配sqlSessionFactoryRef 表示定義了 key ,表示一個唯一 SqlSessionFactory 實例
作者:ChinaXieShuai
鏈接:https://www.jianshu.com/p/735852145580
來源:簡書
簡書著作權歸作者所有,任何形式的轉載都請聯系作者獲得授權並注明出處。
MasterDataSourceConfig的代碼:
package com.cjrh.game_api.jdbc;
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.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
/**
* @program: game_api
* @description:
* @author: Dading
* @create: 2019-04-12 14:14
* @version: 1.0
**/
@Configuration
// 掃描 Mapper 接口並容器管理
@MapperScan(basePackages = MasterDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDataSourceConfig {
// 精確到 master 目錄,以便跟其他數據源隔離
static final String PACKAGE = "com.cjrh.game_api.dao.master";
static final String MAPPER_LOCATION = "classpath:mapper/master/*.xml";
@Value("${master.datasource.url}")
private String url;
@Value("${master.datasource.username}")
private String user;
@Value("${master.datasource.password}")
private String password;
@Value("${master.datasource.driver-class-name}")
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的配置如下:
package com.cjrh.game_api.jdbc;
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;
/**
* @program: game_api
* @description:
* @author: Dading
* @create: 2019-04-12 14:14
* @version: 1.0
**/
@Configuration
// 掃描 Mapper 接口並容器管理
@MapperScan(basePackages = SecondDataSourceConfig.PACKAGE, sqlSessionFactoryRef = "secondSqlSessionFactory")
public class SecondDataSourceConfig {
// 精確到 cluster 目錄,以便跟其他數據源隔離
static final String PACKAGE = "com.cjrh.game_api.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.driver-class-name}")
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();
}
}
項目目錄如下:
原文鏈接:
https://blog.csdn.net/qq_28193409/article/details/89537216
https://www.jianshu.com/p/735852145580