Spring Druid多數據源配置


SpringBoot 多數據源配置

如果需要在一個應用中使用多個數據源,應當如何實現呢,在Spring配置MyBatis中,我們可以看到以下的代碼

<!-- mybatis 的SqlSessionFactory -->
<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean" scope="prototype">
    <property name="dataSource" ref="dataSource"/>
    <property name="configLocation" value="classpath:mybatis-config.xml"/>
</bean>

MyBatis的一個SqlSession即代表了一個數據源的配置,所以要實現多個數據源的,配置多個不同的SqlSession就行

依賴引入

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.1.1</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.15</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.1.10</version>
        </dependency>
    </dependencies>

依賴中引入了mybatis,mysql驅動和druid連接池

配置SqlSession

首先在應用配置文件中添加數據源的相關配置

spring:
  datasource:
    druid:
      # 數據庫訪問配置, 使用druid數據源
      # 數據源1 mysql
      mysql1:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull&serverTimezone=UTC
        username: root
        password: ranger
      # 數據源2 oracle
      mysql2:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.jdbc.Driver
        url: jdbc:mysql://localhost:3306/test1?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&autoReconnect=true&failOverReadOnly=false&zeroDateTimeBehavior=convertToNull&serverTimezone=UTC
        username: root
        password: ranger

在這里配置了兩個數據源

然后分別配置兩個SqlSession

    /**
     * @Author ranger
     * @Date 2019/12/5 23:47
     * MySQL1數據源配置
     **/
    
    @Configuration
    @MapperScan(basePackages = "com.ranger.datasource.mysqlDao", sqlSessionFactoryRef = "mysqlSqlSessionFactory")
    public class MySQLSqlSessionConfig {
    
        @Primary
        @Bean(name = "mysqldatasource")
        @ConfigurationProperties("spring.datasource.druid.mysql1")
        public DataSource mysqlDataSource() {
            return DruidDataSourceBuilder.create().build();
        }
    
        @Bean(name = "mysqlTransactionManager")
        @Primary
        public DataSourceTransactionManager mysqlTransactionManager() {
            return new DataSourceTransactionManager(mysqlDataSource());
        }
    
        @Bean(name = "mysqlSqlSessionFactory")
        @Primary
        public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("mysqldatasource") DataSource dataSource)
                throws Exception {
            final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
            sessionFactory.setDataSource(dataSource);
            //如果不使用xml的方式配置mapper,則可以省去下面這行mapper location的配置。
    //        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
    //                .getResources("classpath:mapper/mysql/*.xml"));
            return sessionFactory.getObject();
        }
    }


/**
 * @Author ranger
 * @Date 2019/12/5 23:53
 * MySQL2數據源配置
 **/

@Configuration
@MapperScan(basePackages = "com.ranger.datasource.otherDao", sqlSessionFactoryRef = "otherSqlSessionFactory")
public class OtherSqlSessionConfig {
    @Bean(name = "otherdatasource")
    @ConfigurationProperties("spring.datasource.druid.mysql2")
    public DataSource mysqlDataSource() {
        return DruidDataSourceBuilder.create().build();
    }

    @Bean(name = "otherTransactionManager")
    public DataSourceTransactionManager mysqlTransactionManager() {
        return new DataSourceTransactionManager(mysqlDataSource());
    }

    @Bean(name = "otherSqlSessionFactory")
    public SqlSessionFactory mysqlSqlSessionFactory(@Qualifier("otherdatasource") DataSource dataSource)
            throws Exception {
        final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
        sessionFactory.setDataSource(dataSource);
        //如果不使用xml的方式配置mapper,則可以省去下面這行mapper location的配置。
//        sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
//                .getResources("classpath:mapper/other/*.xml"));
        return sessionFactory.getObject();
    }
}

兩個數據源分別配置了不同的Mapper路徑

測試

創建一個User實體和UserController來測試數據源是否可以正常使用

@Controller
@RequestMapping("user")
public class UserController {

    // 引入MySQL的配置
    @Autowired
    private MysqlUserDao mysqlUserDao;

    @Autowired
    private OtherUserDao otherUserDao;

    @ResponseBody
    @RequestMapping("all/mysql")
    public List<User> getAll(){
        return mysqlUserDao.selectAll();
    }

    @ResponseBody
    @RequestMapping("all/other")
    public List<User> getAllOther(){
        return otherUserDao.selectAll();
    }
}

瀏覽器訪問http://localhost:8080/user/all/mysqlhttp://localhost:8080/user/all/other可以看到不同的返回結果

mysql數據源.png

other數據源.png

這樣就實現了多數據源,不同的Dao使用不同的數據源


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM