SpringBoot基礎教程(三)——多數據源結合

緊接上篇文章SpringBoot基礎教程(二)——與Mybatis的結合,我們討論了與Mybatis的結合,但是在實際工作中,我們操作的可能不是一個數據庫,也就是說我們有可能操縱多個數據源,這個又該怎么配置呢?其實也是大同小異,總之就是一句話,把每個數據庫的配置分隔開,不要讓他們相互影響就行了。請看下面的示例

/**
 * pajk.com Inc.
 * Copyright (c) 2014-2015 All Rights Reserved.
 */
package com.shuqi;

import com.alibaba.druid.filter.Filter;
import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.pool.DruidDataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.io.Resource;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;
import org.springframework.transaction.support.TransactionTemplate;

import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;


@Configuration
public class DalConfig {


    @Configuration
    @MapperScan(basePackages = "com.shuqi.dal.mapper.user",sqlSessionFactoryRef = "userSqlSessionFactory")
    @EnableTransactionManagement
    static class UserDalConfig{

        @Value(value = "classpath:mybatis/sqlmap/user/*.xml")
        private Resource[] mapperLocations;

        @Value(value = "classpath:mybatis/mybatis-config.xml")
        private Resource configLocation;


        @Bean
        public SqlSessionFactoryBean userSqlSessionFactory(DruidDataSource userDataSource) {
            SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
            ssfb.setMapperLocations(mapperLocations);
            ssfb.setConfigLocation(configLocation);
            ssfb.setDataSource(userDataSource);
            return ssfb;
        }

        @Bean(initMethod = "init", destroyMethod = "close")
        public DruidDataSource userDataSource(@Value("${ds.user.jdbc.url}") String url,
                                          @Value("${ds.user.jdbc.username}") String username,
                                          @Value("${ds.user.jdbc.password}") String password) throws SQLException {
            DruidDataSource druidDataSource = new DruidDataSource();
            druidDataSource.setUrl(url);
            druidDataSource.setUsername(username);
            druidDataSource.setPassword(password);
            druidDataSource.setMaxActive(60);
            druidDataSource.setInitialSize(1);
            druidDataSource.setMaxWait(60000);//60s
            druidDataSource.setMinIdle(1);
            druidDataSource.setTimeBetweenEvictionRunsMillis(3000);
            druidDataSource.setMinEvictableIdleTimeMillis(300000);
            druidDataSource.setValidationQuery("select 1");
            druidDataSource.setTestWhileIdle(true);
            druidDataSource.setTestOnBorrow(false);
            druidDataSource.setTestOnReturn(false);
            druidDataSource.setPoolPreparedStatements(true);
            druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(20);
            druidDataSource.setFilters("config");
            Properties properties = new Properties();
            properties.put("config.decrypt", "false");
            druidDataSource.setConnectProperties(properties);

            StatFilter statFilter = new StatFilter();
            statFilter.setSlowSqlMillis(10000);//10s。。慢
            statFilter.setMergeSql(true);
            statFilter.setLogSlowSql(true);

            List<Filter> filterList = new ArrayList<Filter>();
            filterList.add(statFilter);
            druidDataSource.setProxyFilters(filterList);

            return druidDataSource;
        }



        @Bean
        public PlatformTransactionManager userTransactionManager(DataSource userDataSource) throws SQLException {
            return new DataSourceTransactionManager(userDataSource);
        }

        @Bean
        public TransactionTemplate userTransactionTemplate(PlatformTransactionManager userTransactionManager) {
            return new TransactionTemplate(userTransactionManager);
        }

    }

    @Configuration
    @MapperScan(basePackages = "com.shuqi.dal.mapper.log",sqlSessionFactoryRef = "logSqlSessionFactory")
    @EnableTransactionManagement
    static class LogDalConfig{

        @Value(value = "classpath:mybatis/sqlmap/log/*.xml")
        private Resource[] mapperLocations;

        @Value(value = "classpath:mybatis/mybatis-config.xml")
        private Resource configLocation;


        @Bean
        public SqlSessionFactoryBean logSqlSessionFactory(DruidDataSource logDataSource) {
            SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
            ssfb.setMapperLocations(mapperLocations);
            ssfb.setConfigLocation(configLocation);
            ssfb.setDataSource(logDataSource);
            return ssfb;
        }

        @Bean(initMethod = "init", destroyMethod = "close")
        public DruidDataSource logDataSource(@Value("${ds.log.jdbc.url}") String url,
                                          @Value("${ds.log.jdbc.username}") String username,
                                          @Value("${ds.log.jdbc.password}") String password) throws SQLException {
            DruidDataSource druidDataSource = new DruidDataSource();
            druidDataSource.setUrl(url);
            druidDataSource.setUsername(username);
            druidDataSource.setPassword(password);
            druidDataSource.setMaxActive(60);
            druidDataSource.setInitialSize(1);
            druidDataSource.setMaxWait(60000);//60s
            druidDataSource.setMinIdle(1);
            druidDataSource.setTimeBetweenEvictionRunsMillis(3000);
            druidDataSource.setMinEvictableIdleTimeMillis(300000);
            druidDataSource.setValidationQuery("select 1");
            druidDataSource.setTestWhileIdle(true);
            druidDataSource.setTestOnBorrow(false);
            druidDataSource.setTestOnReturn(false);
            druidDataSource.setPoolPreparedStatements(true);
            druidDataSource.setMaxPoolPreparedStatementPerConnectionSize(20);
            druidDataSource.setFilters("config");
            Properties properties = new Properties();
            properties.put("config.decrypt", "false");
            druidDataSource.setConnectProperties(properties);

            StatFilter statFilter = new StatFilter();
            statFilter.setSlowSqlMillis(10000);//10s。。慢
            statFilter.setMergeSql(true);
            statFilter.setLogSlowSql(true);

            List<Filter> filterList = new ArrayList<Filter>();
            filterList.add(statFilter);
            druidDataSource.setProxyFilters(filterList);

            return druidDataSource;
        }



        @Bean
        public PlatformTransactionManager logTransactionManager(DataSource logDataSource) throws SQLException {
            return new DataSourceTransactionManager(logDataSource);
        }

        @Bean
        public TransactionTemplate logTransactionTemplate(PlatformTransactionManager logTransactionManager) {
            return new TransactionTemplate(logTransactionManager);
        }

    }
}

每個數據庫的配置都通過一個靜態內部類的形式進行定義,每個庫的配置使用自己的那部分就行了,大家可以下載源碼試一下。

下節將的內容是:SpringBoot基礎教程(四)——與Swagger2的結合

本節項目源碼

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容