`

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
引用

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

public class DynamicDataSource extends AbstractRoutingDataSource {

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


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 测试一下,数据保存成功。
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics