spring boot实操 之整合数据库多数据源

本实例已两个数据库为例:一个为主数据库,一个为只读数据库

第一:封装基础配置类

public class BaseDBConfig {

    public DataSource buildDataSource(DBPropertiesConfig dbPropertiesConfig) {
        DruidDataSource masterDataSource = new DruidDataSource();
        masterDataSource.setDriverClassName(dbPropertiesConfig.getDriverClassName());
        masterDataSource.setUrl(dbPropertiesConfig.getUrl());
        masterDataSource.setUsername(dbPropertiesConfig.getUsername());
        masterDataSource.setPassword(dbPropertiesConfig.getPassword());
        masterDataSource.setInitialSize(dbPropertiesConfig.getInitialSize());
        masterDataSource.setMaxActive(dbPropertiesConfig.getMaxActive());
        masterDataSource.setMinIdle(dbPropertiesConfig.getMinIdle());
        masterDataSource.setMaxWait(dbPropertiesConfig.getMaxWait());
        masterDataSource.setMinEvictableIdleTimeMillis(dbPropertiesConfig.getMinEvictableIdleTimeMillis());
        masterDataSource.setUseGlobalDataSourceStat(dbPropertiesConfig.isUseGlobalDataSourceStat());
        masterDataSource.setTimeBetweenEvictionRunsMillis(dbPropertiesConfig.getTimeBetweenEvictionRunsMillis());
        return masterDataSource;
    }

    public DataSourceTransactionManager buildTransactionManager(DBPropertiesConfig dbPropertiesConfig) {
        return new DataSourceTransactionManager(buildDataSource(dbPropertiesConfig));
    }

    public SqlSessionFactory buildSqlSessionFactory(DataSource dataSource, String packagePath,String mapperLocation) throws Exception {
        final SqlSessionFactoryBeanExt sessionFactory = new SqlSessionFactoryBeanExt();
        sessionFactory.setDataSource(dataSource);
        sessionFactory.setBasePackage(packagePath);
        if (!StringUtils.isEmpty(mapperLocation)) {
            sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
                    .getResources(mapperLocation));
        }
        return sessionFactory.getObject();
    }

}
package com.tencent.config.dbconfig;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * @author : huang
 * @Description: TODO
 * @date Date : 2019-05-13-10:27 10:27
 **/

@Data
@NoArgsConstructor
@AllArgsConstructor
public class DBPropertiesConfig {

    /**
     * 数据库url
     */
    private String url;

    /**
     * 数据库用户名
     */
    private String username;

    /**
     * 数据库密码
     */
    private String password;

    /**
     * 驱动类名
     */
    private String driverClassName;

    private int initialSize;

    private int maxActive;

    private int minIdle;

    private long maxWait;

    private long minEvictableIdleTimeMillis;

    private boolean useGlobalDataSourceStat;

    private long timeBetweenEvictionRunsMillis;
}

第三步,配置主数据库

package com.tencent.config.dbconfig;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

/**
 * @author : huang
 * @Description: 主数据库配置类
 * @date Date : 2019-04-19-10:08 10:08
 **/
@Slf4j
@Configuration
@MapperScan(basePackages = MasterDBConfig.PACKAGE, sqlSessionFactoryRef = "masterSqlSessionFactory")
public class MasterDBConfig extends BaseDBConfig {
    static final String PACKAGE = "com.tencent.iov.data.anlayze.dao.master";

    @Bean(name = "masterDataSource")
    @Primary
    @Override
    public DataSource buildDataSource(@Qualifier("masterDBProperties") DBPropertiesConfig dbPropertiesConfig) {
        log.info("master properties:{}", JSON.toJSONString(dbPropertiesConfig));
        return super.buildDataSource(dbPropertiesConfig);
    }

    @Bean(name = "masterTransactionManager")
    @Primary
    @Override
    public DataSourceTransactionManager buildTransactionManager(@Qualifier("masterDBProperties") DBPropertiesConfig dbPropertiesConfig) {
        log.info("master properties:{}", JSON.toJSONString(dbPropertiesConfig));
        return super.buildTransactionManager(dbPropertiesConfig);
    }

    @Bean(name = "masterSqlSessionFactory")
    @Primary
    public SqlSessionFactory masterSqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
        return super.buildSqlSessionFactory(dataSource, PACKAGE,null); //"classpath:mybatis-mappers/master/*Mapper.xml"
    }

    @Bean(name = "masterDBProperties")
    @ConfigurationProperties(prefix = "datasource.master")
    public DBPropertiesConfig getBaseDBProperties() {
        return new DBPropertiesConfig();
    }
}

第四步,配置只读数据库

package com.tencent.config.dbconfig;

import com.alibaba.fastjson.JSON;
import lombok.extern.slf4j.Slf4j;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

/**
 * @author : huang
 * @Description: 只读订单数据库配置类
 * @date Date : 2019-04-19-10:08 10:08
 **/
@Slf4j
@Configuration
@MapperScan(basePackages = OrderDBConfig.PACKAGE, sqlSessionFactoryRef = "orderSqlSessionFactory")
public class OrderDBConfig extends BaseDBConfig {
    static final String PACKAGE = "com.tencent.iov.data.anlayze.dao.order";

    @Bean(name = "orderDataSource")
    @Override
    public DataSource buildDataSource(@Qualifier("orderDBProperties") DBPropertiesConfig dbPropertiesConfig) {
        log.info("order properties:{}", JSON.toJSONString(dbPropertiesConfig));
        return super.buildDataSource(dbPropertiesConfig);
    }

    @Bean(name = "orderTransactionManager")
    @Override
    public DataSourceTransactionManager buildTransactionManager(@Qualifier("orderDBProperties") DBPropertiesConfig dbPropertiesConfig) {
        log.info("order properties:{}", JSON.toJSONString(dbPropertiesConfig));
        return super.buildTransactionManager(dbPropertiesConfig);
    }

    @Bean(name = "orderSqlSessionFactory")
    public SqlSessionFactory buildSqlSessionFactory(@Qualifier("orderDataSource") DataSource dataSource) throws Exception {
        return super.buildSqlSessionFactory(dataSource, PACKAGE,"classpath:mybatis-mappers/order/*Mapper.xml");
    }

    @Bean(name = "orderDBProperties")
    @ConfigurationProperties(prefix = "datasource.order")
    public DBPropertiesConfig getBaseDBProperties() {
        return new DBPropertiesConfig();
    }
}

第五步:yaml文件添加配置,配置如下


datasource:
  #主数据库
  master:
    url: jdbc:mysql://10.1.1.1:3306/db_data?useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true
    username: 
    password: 
    driverClassName: com.mysql.jdbc.Driver
    initialSize: 10
    maxActive: 20
    minIdle: 5
    maxWait: 10000
    minEvictableIdleTimeMillis: 300000
    useGlobalDataSourceStat: true
    timeBetweenEvictionRunsMillis: 60000
  #order只读库
  order:
    url: jdbc:mysql://10.1.2.3:3306/db_order?useUnicode=true&characterEncoding=utf8&useSSL=false&allowMultiQueries=true
    username: 
    password: 
    driverClassName: com.mysql.jdbc.Driver
    initialSize: 10
    maxActive: 20
    minIdle: 5
    maxWait: 10000
    minEvictableIdleTimeMillis: 300000
    useGlobalDataSourceStat: true
    timeBetweenEvictionRunsMillis: 60000

注意:由于每一个数据源配置了dao的mapper接口路径及mapper.xml路径,所有,这两类文件目录要放对,如下图:

至此,多数据源配置完成。demo可以找博主要。

猜你喜欢

转载自blog.csdn.net/huangpeigui/article/details/90518547
今日推荐