tomcat配置多数据源和JAVA实现数据库切换

398 阅读1分钟

正在维护的一个老项目未使用微服务框架,用的还是老的tomcat、spring、mysql相关的技术,现在项目有新需求想实现向另一个数据库sqlserver同步数据,就考虑到切换多数据源实现

1、tomcat配置多数据源,配置mysql和sqlserver

tomcat /conf/context.xml 中mysql的配置

image.png

tomcat /conf/context.xml 中sqlserver的配置

image.png

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);