需求:不同的方法在获取数据时,动态的切换来自不同的数据库数据源,本篇文章仅用于记录学习过程,若觉得写的不够详细,还请谅解。
一、数据库配置文件application.properties,请注意下面的两个URL写法不一样,两种写法对应后面创建连接的方法不一样,这里都试一下。
mybatis.mapper-locations=classpath:mapper/*.xml
spring.datasource.primary.jdbc-url=jdbc:mysql://localhost:3306/ceshi?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&allowMultiQueries=true
spring.datasource.primary.username=root
spring.datasource.primary.password=root
spring.datasource.primary.driver-class-name=com.mysql.jdbc.Driver
#spring.datasource.second.jdbc-url=jdbc:mysql://localhost:3306/ceshi2?useSSL=false
spring.datasource.second.url=jdbc:mysql://localhost:3306/ceshi2?useSSL=false&useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&allowMultiQueries=true
spring.datasource.second.username=root
spring.datasource.second.password=root
spring.datasource.second.driver-class-name=com.mysql.jdbc.Driver
二、DynamicDatasourceHolder类,该类用于操作和保存创建的连接,用ThreadLocal保存创建的数据源,可适用于并发操作,ThreadLocal的用法和好处可自行百度。
/*
* 通过ThreadLocal维护一个全局唯一的map来实现数据源的动态切换
*/
public class DynamicDatasourceHolder {
private static final ThreadLocal<String> DATASOURCE_HOLDER = new ThreadLocal<String>();
/** * 数据源的 key 集合,用于切换时判断数据源是否存在 */
public static List<Object> dataSourceKeys = new ArrayList<>();
/** * To switch DataSource * * @param key the key */
public static void setDataSourceKey(String key) {
DATASOURCE_HOLDER.set(key);
}
/** * Get current DataSource * * @return data source key */
public static String getDataSourceKey() {
return DATASOURCE_HOLDER.get();
}
/** * To set DataSource as default */
public static void clearDataSourceKey() {
DATASOURCE_HOLDER.remove();
}
/** * Check if give DataSource is in current DataSource list * * @param key the key * @return boolean boolean */
public static boolean containDataSourceKey(String key) {
return dataSourceKeys.contains(key);
}
三、DynamicDataSource类,该类必须要继承AbstractRoutingDataSource方法,并实现其AbstractRoutingDataSource方法,AbstractRoutingDataSource类亦可自行百度。
@Override
protected Object determineCurrentLookupKey() {
return DynamicDatasourceHolder.getDataSourceKey();
}
四、DataSourceConfig类,该类为关键核心类,用于通过读取配置文件并根据不同的数据库连接参数创建不同的数据源,这里在创建两个不同的数据源时,使用了两种不同的创建方式分别为DataSourceBuilder.create().build()方法和com.alibaba.druid.pool.DruidDataSource(),这两种方法在使用时配置文件中的url参数写法略有不同,分别为.url和.jdbc-url请留意。
/**
* ClassName: DataSourceConfig
* Describe:
* 数据源配置
*/
@MapperScan(basePackages = "com.hz.GeoDataSystem.dao