正在维护的一个老项目未使用微服务框架,用的还是老的tomcat、spring、mysql相关的技术,现在项目有新需求想实现向另一个数据库sqlserver同步数据,就考虑到切换多数据源实现
1、tomcat配置多数据源,配置mysql和sqlserver
tomcat /conf/context.xml 中mysql的配置
tomcat /conf/context.xml 中sqlserver的配置
2、JAVA代码实现多数据源切换
(1)配置切换数据库名称
注:dataSource、dataSource_two是在applicationContext-spring.xml配置文件中配置的名称,然后对应tomcat中name的名字
public enum DataSourceEnum {
MOUNTAINFLOOD("dataSource"),
TESTDB("dataSource_two");
String dataSourceName;
// 是否是默认数据源
private boolean master;
DataSourceEnum(String dataSourceName) {
this.dataSourceName = dataSourceName;
}
public String getDataSourceName() {
return dataSourceName;
}
public void setDataSourceName(String dataSourceName) {
this.dataSourceName = dataSourceName;
}
public boolean isMaster() {
return master;
}
public void setMaster(boolean master) {
this.master = master;
}
public String getDefault() {
String defaultDataSource = "";
for (DataSourceEnum dataSourceEnum : DataSourceEnum.values()) {
if (!"".equals(defaultDataSource)) {
break;
}
if (dataSourceEnum.master) {
defaultDataSource = dataSourceEnum.getDataSourceName();
}
}
return defaultDataSource;
}
}
(2)获取/设置数据库
public class DataSourceContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();
/**
* @Description: 设置数据源类型
* @param dataSourceType 数据库类型
* @return void
* @throws
*/
public static void setDataSourceType(String dataSourceType) {
contextHolder.set(dataSourceType);
}
/**
* @Description: 获取数据源类型
* @return String
* @throws
*/
public static String getDataSourceType() {
return contextHolder.get();
}
/**
* @Description: 清除数据源类型
* @return void
* @throws
*/
public static void clearDataSourceType() {
contextHolder.remove();
}
}
(3)动态切换数据库设置
public class DynamicDataSource extends AbstractRoutingDataSource {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();
@Override
protected Object determineCurrentLookupKey() {
String dataSource = getDataSource();
return dataSource;
}
/**
* 设置数据源
*
* @param dataSource
*/
public static void setDataSource(String dataSource) {
contextHolder.set(dataSource);
}
/**
* 获取数据源
*
* @return
*/
public static String getDataSource() {
String dataSource = contextHolder.get();
// 如果没有指定数据源,使用默认数据源
if (null == dataSource) {
DynamicDataSource.setDataSource(DataSourceEnum.TESTDB.getDefault());
}
return contextHolder.get();
}
}
(4)切换数据库
DynamicDataSource.setDataSource(DataSourceEnum.MOUNTAINFLOOD);