当我们在进行数据库分库分表操作是可能会需要到多个数据库,那么我们就需要对多个数据库的数据源进行配置.
整理一下,今天在SpringBoot框架下多个数据源的配置过程(两个为例):
1.配置数据库信息:在yml配置文件中配置需要的数据库信息
spring:
datasource_1:
# 配置第一个数据库的地址信息
url: jdbc:mysql://127.0.0.1:3306/***
username: root
password: root
# 设置数据源
type: com.alibaba.druid.pool.DruidDataSource
datasource_2:
# 配置第一个数据库的地址信息
url: jdbc:mysql://127.0.0.1:3306/***
username: root
password: root
type: com.alibaba.druid.pool.DruidDataSource
2.因为我们可能需要在不同的情况使用不同的数据源,所以需要在主启动类下忽略自动配置的数据源
@SpringBootApplication(exclude = DataSourceAutoConfiguration.class)
3.配置数据源信息 , 将数据源注入到Spring容器中
@Configuration
public class DynamicDataSourceConfig {
// 读取配置文件的信息
@Value("${spring.datasource_1.url}")
private String url1;
@Value("${spring.datasource_2.url}")
private String url2;
@Value("${spring.datasource_1.username}")
private String userName;
@Value("${spring.datasource_1.password}")
private String password;
/**
* 配置数据源1
*
* @return
*/
@Bean
public DataSource dataSource1() {
HikariDataSource hikariDataSource = new HikariDataSource();
hikariDataSource.setJdbcUrl(url1);
hikariDataSource.setUsername(userName);
hikariDataSource.setPassword(password);
return hikariDataSource;
}
/**
* 配置数据源2
*
* @return
*/
@Bean
public DataSource dataSource2() {
HikariDataSource hikariDataSource = new HikariDataSource();
hikariDataSource.setJdbcUrl(url2);
hikariDataSource.setUsername(userName);
hikariDataSource.setPassword(password);
return hikariDataSource;
}
/**
* 设置默认数据源
*
* @return DataSource
*/
@Bean
public DataSource dynamicDataSource(DataSource dataSource1, DataSource dataSource2) {
Map<Object, Object> dataMap = new HashMap<>((int) (2 / 0.75) + 1);
// 这里map中的key会在我们动态设置数据源的时候使用
dataMap.put("dataSource1", dataSource1);
dataMap.put("dataSource2", dataSource2);
DynamicDataSource dynamicDataSource = new DynamicDataSource();
dynamicDataSource.setDefaultTargetDataSource(dataSource1);
dynamicDataSource.setTargetDataSources(dataMap);
return dynamicDataSource;
}
/**
* 配置 MybatisSqlSessionFactoryBean
* @param dynamicDataSource
* @return
*/
@Bean
public MybatisSqlSessionFactoryBean sqlSessionFactoryBean(DataSource dynamicDataSource){
MybatisSqlSessionFactoryBean mybatisSqlSessionFactoryBean = new MybatisSqlSessionFactoryBean();
mybatisSqlSessionFactoryBean.setDataSource(dynamicDataSource);
// 设置实体类别名
mybatisSqlSessionFactoryBean.setTypeAliasesPackage("实体类路径");
try {
// 扫描的XML路径
Resource[] resources = new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml");
mybatisSqlSessionFactoryBean.setMapperLocations(resources);
} catch (IOException e) {
e.printStackTrace();
}
return mybatisSqlSessionFactoryBean;
}
}
4.封装一个ThreadLocal
public class ThreadLocalDataSource {
static ThreadLocal<String> threadLocal = new ThreadLocal<String>();
public static void set(String key){
threadLocal.set(key);
}
public static String get(){
return threadLocal.get();
}
}
5.创建类继承AbstractRoutingDataSource,在重写的方法里面设置数据源
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
// 调用前面封装的ThreadLocal中的set方法指定数据源的名字,通过get在这里获取设置的数据源
return ThreadLocalDataSource.get();
}
}
通过五个步骤就配置好了多个数据源 。
在使用的时候只需要通过指定的分库分表的规则将用到的数据源的名称(就是在第三步的map对应的Key)传到调用封装的ThreadLocalDataSource类中的set方法中即可。
配置数据源就到这了 (如有遗漏请指正,谢谢)。