如何在spring框架中解决多数据源的问题

 我来答
白菜一颗
2015-12-14 · TA获得超过8916个赞
知道大有可为答主
回答量:3260
采纳率:69%
帮助的人:3698万
展开全部

spring 配置文件:

    <!-- 数据源 A -->
    <bean id="dataSourceA" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${driver}" />
<property name="jdbcUrl" value="${urlScm}" />
<property name="user" value="${usernameScm}" />
<property name="password" value="${passwordScm}" />
    </bean>
    
    <!-- 数据源 B -->
    <bean id="dataSourceB" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${driver}" />
<property name="jdbcUrl" value="${urlWS}" />
<property name="user" value="${usernameWS}" />
<property name="password" value="${passwordWS}" />
    </bean>

<!-- 多数据源管理,默认为 dataSourceScm 数据源 -->
     <bean id="dataSource" class="com.common.dataSource.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="dataSourceA" value-ref="dataSourceA" />
<entry key="dataSourceB" value-ref="dataSourceB" />
</map>
</property>
<property name="defaultTargetDataSource" ref="dataSourceA" />
</bean>

多数据源切换的基础类:

package com.common.dataSource;

import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource extends AbstractRoutingDataSource {

@Override
protected Object determineCurrentLookupKey() {
return DbContextHolder.getDbType();   
}

}

切换的操作类:

package com.common.dataSource;

public class DbContextHolder {

private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>();

public static void setDbType(String dbType) {
contextHolder.set(dbType);
}

public static String getDbType() {
return (String) contextHolder.get();
}

public static void clearDbType() {
contextHolder.remove();
}
}

使用的时候调用 DbContextHolder.setDbType 方法,传入相应的在 spring 配置文件里面的配置的数据源名称就可以了

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式