Spring Boot多数据源配置与使用

Spring Cloud中集成多数据源
1.介绍
但是往往随着业务量发展,我们通常会进行数据库拆分或是引入其他数据库,从而我们需要配置多个数据源,下面基于之前的JdbcTemplate和Spring-data-jpa例子分别介绍两种多数据源的配置方式。
2.多数据源配置
创建一个Spring配置类,定义两个DataSource用来读取application.yml中的不同配置。如下例子中,

master:

master:
datasource:
url:jdbc:mysql://127.0.0.1:3306/bigfans_shipping? autoReconnect=true&useUnicode=true&characterEncoding=utf8
username: root
password: admin
driverClassName: com.mysql.jdbc.Driver

cluster

cluster1:
datasource:
url:jdbc:mysql://127.0.0.1:3306/bigfans_shipping?autoReconnect=true&useUnicode=true&characterEncoding=utf8
username: root
password: admin
driverClassName: com.mysql.jdbc.Driver
Spring Boot多数据源配置与使用

然后建一个配置类

 @Configuration
public class DataSourceConfig implements EnvironmentAware {

private static final String MYBATIS_MAPPER_LOCATION = "classpath:mybatis/mapper/*-Mapper.xml";
private static final String MYBATIS_CONFIG_LOCATION = "classpath:mybatis/MybatisConfig.xml";

private Environment env;

@Override
public void setEnvironment(Environment env) {
	this.env = env;
}

/**
 * 主库配置
 */
@Bean(name = "masterDataSource")
public DataSource createMasterDataSource() throws Exception {
	DruidDataSource dataSource = new DruidDataSource();
	dataSource.setDriverClassName(env.getProperty("master.datasource.driverClassName"));
	dataSource.setUrl(env.getProperty("master.datasource.url"));
	dataSource.setUsername(env.getProperty("master.datasource.username"));
	dataSource.setPassword(env.getProperty("master.datasource.password"));
	dataSource.setTestWhileIdle(true);
	return dataSource;
}

/**
 * 从库配置
 */
@Bean(name = "clusterDataSource1")
public DataSource createCluster1DataSource() throws Exception {
	DruidDataSource dataSource = new DruidDataSource();
	dataSource.setDriverClassName(env.getProperty("cluster1.datasource.driverClassName"));
	dataSource.setUrl(env.getProperty("cluster1.datasource.url"));
	dataSource.setUsername(env.getProperty("cluster1.datasource.username"));
	dataSource.setPassword(env.getProperty("cluster1.datasource.password"));
	dataSource.setTestWhileIdle(true);
	return dataSource;
}

@Bean(name = "dynamicDataSource")
@Primary
public DataSource createDynamicDataSource(
		@Qualifier("masterDataSource") DataSource masterDataSource ,
		@Qualifier("clusterDataSource1") DataSource clusterDataSource1){
	DynamicDataSource dynamicDataSource = new DynamicDataSource();
	dynamicDataSource.putMaster(masterDataSource);
	dynamicDataSource.putCluster(clusterDataSource1);
	dynamicDataSource.setTargetDataSources();
	return dynamicDataSource;
}

@Bean(name = "transactionManager")
public DataSourceTransactionManager createTransactionManager(@Qualifier("dynamicDataSource") DataSource dynamicDataSource) throws Exception {
	return new DataSourceTransactionManager(dynamicDataSource);
}

@Bean(name = "sqlSessionFactory")
public SqlSessionFactory masterSqlSessionFactory(@Qualifier("dynamicDataSource") DataSource dynamicDataSource)
		throws Exception {
	final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
	sessionFactory.setDataSource(dynamicDataSource);
	ResourcePatternResolver pathResolver = new PathMatchingResourcePatternResolver();
	sessionFactory.setConfigLocation(pathResolver.getResource(MYBATIS_CONFIG_LOCATION));
	sessionFactory.setMapperLocations(pathResolver.getResources(MYBATIS_MAPPER_LOCATION));
	return sessionFactory.getObject();
}

@Bean
public SqlSessionTemplate sqlSessionTemplate(SqlSessionFactory sqlSessionFactory){
	return new SqlSessionTemplate(sqlSessionFactory);
}

@Bean
public JdbcTemplate jdbcTemplate(@Qualifier("dynamicDataSource") DataSource dynamicDataSource){
	return new JdbcTemplate(dynamicDataSource);
}

@Bean
public TransactionTemplate transactionTemplate(@Qualifier("dynamicDataSource") DataSource dynamicDataSource){
	PlatformTransactionManager transactionManager = new DataSourceTransactionManager(dynamicDataSource);
	TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager);
	return transactionTemplate;
}}

以上配置就完成了springboot对多数据源配置和使用了