Spring多数据源配置

今天遇见直接用spring处理多数据源问题,原来都是spring+hibernate/ibatis做的,现在做这个一下有点晕,网上也搜了下,基本上都是上面的框架结构,下面直接上代码,大部分都一样的:
applicationContext.xml 配置两个数据源dataSource1和dataSource2

<bean id="dataSource1" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass">
<value>${jdbc.driverClassName}</value>
</property>
<property name="jdbcUrl">
<value>${jdbc.url}</value>
</property>
<property name="user">
<value>${jdbc.username}</value>
</property>
<property name="password">
<value>${jdbc.password}</value>
</property>

<property name="unreturnedConnectionTimeout"><value>120</value></property>
<property name="debugUnreturnedConnectionStackTraces"><value>true</value></property>
</bean>

<bean id="dataSource2" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass">
<value>${jdbc.driverClassName2}</value>
</property>
<property name="jdbcUrl">
<value>${jdbc.url2}</value>
</property>
<property name="user">
<value>${jdbc.username2}</value>
</property>
<property name="password">
<value>${jdbc.password2}</value>
</property>

<property name="unreturnedConnectionTimeout"><value>120</value></property>
<property name="debugUnreturnedConnectionStackTraces"><value>true</value></property>
</bean>

jdbc.properties

#jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
#jdbc.url=jdbc\:oracle\:thin\:@192.168.199.128\:1521\:orcl\t
#jdbc.username=bob
#jdbc.password=bob

#jdbc.driverClassName2=oracle.jdbc.OracleDriver
#jdbc.url2=jdbc:oracle:thin:@localhost:1521:imagedb
#jdbc.username2=scott
#jdbc.password2=tiger

下面是配置jdbc配置文件和创建dynamicDataSource

<bean id="propertyConfigurer" class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
<property name="locations">
<list>
<value>classpath:/jdbc.properties</value>
</list>
</property>
</bean>

<bean id="dynamicDataSource" class="com.harbortek.dynamic.DynamicDataSource" >
<!-- 通过key-value的形式来关联数据源 -->
<property name="targetDataSources">
<map>
<entry value-ref="dataSource1" key="dataSource1"></entry>
<entry value-ref="dataSource2" key="dataSource2"></entry>
</map>
</property>
<property name="defaultTargetDataSource" ref="dataSource1" />
</bean>

设置jdbcTemplate

<!-- JdbcTemplate使用动态数据源的配置 -->
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate" abstract="false"
lazy-init="false" autowire="default" dependency-check="default">
<property name="dataSource">
<ref bean="dynamicDataSource" />
</property>
</bean>

DBContextHolder

public class DBContextHolder {

public static final String DATA_SOURCE_A = "dataSource1";
public static final String DATA_SOURCE_B = "dataSource2";

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

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

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

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

DynamicDataSource
[quote]
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

public class DynamicDataSource extends AbstractRoutingDataSource {

@Override
protected Object determineCurrentLookupKey() {
// TODO Auto-generated method stub
return DBContextHolder.getDBType();
}
}
[/quote]

Service 里处理如下

//VIP查询
public List queryCustomer(String phoneNumber, String idcardNumber) {
//在这里切换数据源就可以了
DBContextHolder.setDBType(DBContextHolder.DATA_SOURCE_A);
return webServiceJdbcDao.getVipCustomer(phoneNumber, idcardNumber);
}

在配置bean里要特别注意一点,就是autowire在多个datasource时要用byName,如果用byType的话spring不知道用那个提示有多个dataSource。配置如下

service.xml
<bean id="services" class="com.test.service.Services" autowire="byName" />
dao.xml
<bean id="webServiceJdbcDao" class="com.test.dao.WebServiceJdbcDao" autowire="byName">


ok 测试一下,数据保存成功。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值