springboot2.0 mysql+mybatis 數據源配置多個數據源 application.yml
寫在前面:
最近項目中需要配置多個mysql數據源,代碼貼出來學習一下
代碼:
yml
spring:
datasource:
multiplenames: db2
type: com.alibaba.druid.pool.DruidDataSource
druid:
# 特別注意:java 9以後需要將com.mysql.jdbc.Driver 改爲 com.mysql.cj.jdbc.Driver即可
driver-class-name: com.mysql.cj.jdbc.Driver
#基本屬性
url: jdbc:mysql://127.0.0.1:3306:3306/test1?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password: root123
#配置初始化大小/最小/最大[僅用於測試,生成環境需要修改哦]
initial-size: 1
min-idle: 1
max-active: 20
#獲取連接等待超時時間
max-wait: 60000
#間隔多久進行一次檢測,檢測需要關閉的空閒連接
time-between-eviction-runs-millis: 60000
#一個連接在池中最小生存的時間
min-evictable-idle-time-millis: 300000
#指定獲取連接時連接校驗的sql查詢語句
validation-query: SELECT 'x'
#驗證連接的有效性
test-while-idle: true
#獲取連接時候驗證,會影響性能(不建議true)
test-on-borrow: false
#打開PSCache,並指定每個連接上PSCache的大小。oracle設爲true,mysql設爲false。分庫分表較多推薦設置爲false
pool-prepared-statements: false
max-pool-prepared-statement-per-connection-size: 20
db2:
type: com.alibaba.druid.pool.DruidDataSource
druid:
# 特別注意:java 9以後需要將com.mysql.jdbc.Driver 改爲 com.mysql.cj.jdbc.Driver即可
# 否則報錯:Loading class `com.mysql.jdbc.Driver'. This is deprecated.
driver-class-name: com.mysql.cj.jdbc.Driver
#基本屬性
url: jdbc:mysql://127.0.0.1:3306/test2?charset=utf8mb4&useSSL=false
username: root
password: root123
#配置初始化大小/最小/最大[僅用於測試,生成環境需要修改哦]
initial-size: 1
min-idle: 1
max-active: 20
#獲取連接等待超時時間
max-wait: 60000
#間隔多久進行一次檢測,檢測需要關閉的空閒連接
time-between-eviction-runs-millis: 60000
#一個連接在池中最小生存的時間
min-evictable-idle-time-millis: 300000
#指定獲取連接時連接校驗的sql查詢語句
validation-query: SELECT 'x'
#驗證連接的有效性
test-while-idle: true
#獲取連接時候驗證,會影響性能(不建議true)
test-on-borrow: false
#打開PSCache,並指定每個連接上PSCache的大小。oracle設爲true,mysql設爲false。分庫分表較多推薦設置爲false
pool-prepared-statements: false
max-pool-prepared-statement-per-connection-size: 20
項目結構
![在這裏插入圖片描述](https://img-blog.csdnimg.cn/20190923192300292.png
MasterDbConfig
import com.alibaba.druid.pool.DruidDataSource;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
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;
@Configuration
@MapperScan(basePackages = {"你的mapper.master"}, sqlSessionTemplateRef = "masterSqlSessionTemplate")
public class MasterDbConfig {
@Bean
//默認數據源
@Primary
//類型安全的屬性配置
@ConfigurationProperties(prefix = "spring.datasource.druid")
public DataSource mysqDataSource() {
//通過DataSourceBuilder構建數據源
return DataSourceBuilder.create().type(DruidDataSource.class).build();
}
@Bean(name = "masterSqlSessionFactory")
@Primary
public SqlSessionFactory masterSqlSessionFactory(DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//todo 換成你的哈
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mappers/master/*.xml"));
return bean.getObject();
}
//事務管理器
@Bean(name = "masterTransactionManager")
@Primary
public DataSourceTransactionManager masterTransactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "masterSqlSessionTemplate")
@Primary
public SqlSessionTemplate masterSqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
transDbConfig
@Configuration
@MapperScan(basePackages = {"你的mapper.transas"}, sqlSessionTemplateRef = "transasSqlSessionTemplate")
public class transDbConfig {
@Bean
@Qualifier(" db2")//指定bean的名稱
@ConfigurationProperties(prefix = "spring.datasource. db2.druid")
public DataSource oracleDataSource() {
return DataSourceBuilder.create().type(DruidDataSource.class).build();
}
@Bean(name = "transSqlSessionFactory")
public SqlSessionFactory secondSqlSessionFactory(@Qualifier("db2") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
//todo 換成你的哈
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mappers/trans/*.xml"));
return bean.getObject();
}
@Bean(name = "transTransactionManager")
public DataSourceTransactionManager secondTransactionManager(@Qualifier(" db2") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "transSqlSessionFactory")
public SqlSessionTemplate secondSqlSessionTemplate(@Qualifier("transSqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
事物:
@Transactional(rollbackFor = Exception.class, transactionManager = “transTransactionManager”)
這裏事務只能支持單個數據源事務。transactionManager不寫則是默認數據源的事務masterSqlSessionFactory,指定是transSqlSessionFactory則是第二個數據源的事務生效。