springboot2.0 mysql+mybatis 數據源配置多個數據源 application.yml

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則是第二個數據源的事務生效。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章