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
然后建一个配置类
@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对多数据源配置和使用了