你可以通过扩展spring 并覆盖应该返回引用要使用的数据源spring bean的键的方法来使用spring的
AbstractRoutingDataSourcedetermineCurrentLookupKey()。
基本上要回答你的问题,你需要做的是在XML配置中将两个数据源定义为不同的spring bean。无需动态创建一个,spring会同时加载两者,并根据
determineCurrentLookupKey()方法中的条件动态使用一个或另一个。
这将导致类似:
XML配置
<!-- first data source --><bean id="majorDataSource" > <property name="serverName" value="${jdbc.major.serverName}" /> <property name="portNumber" value="${jdbc.major.portNumber}" /> <property name="user" value="${jdbc.major.username}" /> <property name="password" value="${jdbc.major.password}" /> <property name="databaseName" value="${jdbc.major.databaseName}" /></bean><!-- second data source --><bean id="minorDataSource" > <property name="serverName" value="${jdbc.minor.serverName}" /> <property name="portNumber" value="${jdbc.minor.portNumber}" /> <property name="user" value="${jdbc.minor.username}" /> <property name="password" value="${jdbc.minor.password}" /> <property name="databaseName" value="${jdbc.minor.databaseName}" /></bean><!-- facade data source --><bean id="dataSource" > <property name="targetDataSources"> <map> <entry key="MINOR" value-ref="minorDataSource"/> <entry key="MAJOR" value-ref="majorDataSource"/> </map> </property> <property name="defaultTargetDataSource" ref="majorDataSource"/></bean><!-- wiring up --><bean id="transactionManager" > <property name="dataSource" ref="dataSource"/></bean><tx:annotation-driven transaction-manager="transactionManager"/><bean id="sqlSessionFactory" > <property name="dataSource" ref="dataSource"/> <property name="configLocation" value="classpath:sqlmap-config.xml"/></bean>java
public class MyRoutingDataSource extends AbstractRoutingDataSource { @Override protected Object determineCurrentLookupKey() { // get the current url HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest(); if (request.getRequestURL().toString().endsWith("/minor")) return "MINOR"; else return "MAJOR"; }}


