1. 程式人生 > >SpringBoot實現多資料來源

SpringBoot實現多資料來源

springboot的出現大大方便了我們程式設計師的編碼,不用再去各種xml中配置,節省了大量的時間,我也是剛開始學習。使用springboot實現多資料來源也是相當簡單的,首先在pom中新增相應的資料庫所需的依賴(這裡就不多討論了),然後在如圖的properties檔案中配置相應的屬性,

我們在單資料來源的時候配置檔案是這樣的:

但是這裡我們需要配置多個數據源,那麼就需要加一些用於區分資料來源的標識,我這裡使用test1,test2來區分

紅色框裡的內容是可以變的,後面的名稱是固定的,預設讀取的就是這個名稱,除非你自己建立一個新的類去讀取這些內容。

然後此時,我們寫了兩個資料庫的連線資訊,那麼程式怎麼知道讀取哪一個資料來源呢,所以我們要自己分別寫讀取資料來源的類,用來連線不同資料庫。程式碼如下:

@Configuration // 註冊到springboot容器中
@MapperScan(basePackages = "com.springboot.mybatis.test01", sqlSessionFactoryRef = "test1SqlSessionFactory")
public class DataSource1Config {


   @Bean(name = "test1DataSource")
   @ConfigurationProperties(prefix = "spring.datasource.test1")
   public DataSource testDataSource() {
      return DataSourceBuilder.create().build();
   }


   @Bean(name = "test1SqlSessionFactory")
   public SqlSessionFactory testSqlSessionFactory(@Qualifier("test1DataSource") DataSource dataSource)
         throws Exception {
      SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
      bean.setDataSource(dataSource);
      // bean.setMapperLocations(
      // new
      // PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test1/*.xml"));
      return bean.getObject();
   }


   @Bean(name = "test1TransactionManager")
   public DataSourceTransactionManager testTransactionManager(@Qualifier("test1DataSource") DataSource dataSource) {
      return new DataSourceTransactionManager(dataSource);
   }

   @Bean(name = "test1SqlSessionTemplate")
   public SqlSessionTemplate testSqlSessionTemplate(
         @Qualifier("test1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
      return new SqlSessionTemplate(sqlSessionFactory);
   }

}

這個類是用來讀取DataSource1的,讀取DataSource2的也是一樣的只需要把上面程式碼中的test1改成test2就好(這主要是因為我是這樣命名的,你也可以根據自己的命名來更改)。如下:

@Configuration // 註冊到springboot容器中
@MapperScan(basePackages = "com.springboot.mybatis.test02", sqlSessionFactoryRef = "test2SqlSessionFactory")
public class DataSource2Config {

    @Bean(name = "test2DataSource")
    @ConfigurationProperties(prefix = "spring.datasource.test2")
    public DataSource testDataSource() {
        return DataSourceBuilder.create().build();
    }


    @Bean(name = "test2SqlSessionFactory")
    public SqlSessionFactory testSqlSessionFactory(@Qualifier("test2DataSource") DataSource dataSource)
            throws Exception {
        SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
        bean.setDataSource(dataSource);
        // bean.setMapperLocations(
        // new
        // PathMatchingResourcePatternResolver().getResources("classpath:mybatis/mapper/test2/*.xml"));
        return bean.getObject();
    }


    @Bean(name = "test2TransactionManager")
    public DataSourceTransactionManager testTransactionManager(@Qualifier("test2DataSource") DataSource dataSource) {
        return new DataSourceTransactionManager(dataSource);
    }

    @Bean(name = "test2SqlSessionTemplate")
    public SqlSessionTemplate testSqlSessionTemplate(
            @Qualifier("test2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) throws Exception {
        return new SqlSessionTemplate(sqlSessionFactory);
    }

}

注意:這裡有一個問題,我們怎麼知道哪個類讀取哪個連線資訊呢?

我們在類上加了一個註解@MapperScan(basePackages = "com.springboot.mybatis.test02", sqlSessionFactoryRef = "test2SqlSessionFactory") 這裡指定了掃面的包路徑,我們通過包名來區分資料來源(還有一種可以通過註解來區分,相關資訊請自行百度尋找)。這樣我們就可以根據訪問不同的包路徑下的類去連線不同的資料庫了。

遇到的問題:

這裡使用的是springboot2.0,springboot1.5的驅動名稱是

spring.datasource.driverClassName,所以這裡注意一下,把名稱改一下,不然會報找不到驅動異常;還有驅動地址也改了,我記得之前mysql的驅動地址是: com.mysql.jdbc.Driver, 而現在是: com.mysql.cj.jdbc.Driver;啟動的時候還遇到一個問題,報了一個mysql時區錯誤The server time zone value 'Öйú±ê׼ʱ¼ä' is unrecognized or represents more than one time zone,查閱相關資料得到答案,只需要在連線資料庫的配置檔案url連線地址後面拼上serverTimezone=UTC引數即可。

本篇文章是在學習了螞蟻課堂的餘勝軍老師的視訊後記錄的,這裡非常感謝餘總的教學。