本实例已两个数据库为例:一个为主数据库,一个为只读数据库
第一:封装基础配置类
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可以找博主要。