今天遇见直接用spring处理多数据源问题,原来都是spring+hibernate/ibatis做的,现在做这个一下有点晕,网上也搜了下,基本上都是上面的框架结构,下面直接上代码,大部分都一样的:
applicationContext.xml 配置两个数据源dataSource1和dataSource2
jdbc.properties
下面是配置jdbc配置文件和创建dynamicDataSource
设置jdbcTemplate
DBContextHolder
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 里处理如下
在配置bean里要特别注意一点,就是autowire在多个datasource时要用byName,如果用byType的话spring不知道用那个提示有多个dataSource。配置如下
ok 测试一下,数据保存成功。
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 测试一下,数据保存成功。