大概是这样子的一个情况:  我在一个方法里面首先需要连接到一个局方库,然后获取数据封装在一个list里面,然后遍历list的时候,我需要切换数据源把数据保存到另外一个库里面,调用了一个writerLog方法,在该方法之前调用了:CurrentContextHolder.setDateSource("gjdx");  但是没有切换过来,大概代码如下,在线求解!采用的是spring3.0.5和ibatis2.3  大概spring配置如下,我配置了两个数据源,默认为zxinDataSource这个数据源:<bean id="parentDataSource" class="org.apache.commons.dbcp.BasicDataSource"
destroy-method="close">
<property name="driverClassName" value="${driverClassName}" />
<property name="initialSize" value="${initialSize}" />
<property name="maxActive" value="${maxActive}" />
<property name="maxIdle" value="${maxIdle}" />
<property name="minIdle" value="${minIdle}" />
</bean> <bean id="zxinDataSource" parent="parentDataSource">
<property name="url" value="${zxin_url}" />
<property name="username" value="${zxin_username}" />
<property name="password" value="${zxin_password}" />
</bean>
<bean id="gjdxDataSource" parent="parentDataSource">
<property name="url" value="${gjdx_url}" />
<property name="username" value="${gjdx_username}" />
<property name="password" value="${gjdx_password}" />
</bean> <bean id="dataSource" class="com.xxx.pub.DynamicDataSource">
<property name="targetDataSources">
<map key-type="java.lang.String">
<entry key="zxin" value-ref="zxinDataSource" />
<entry key="gjdx" value-ref="gjdxDataSource" />
</map>
</property>
 <property name="defaultTargetDataSource" ref="zxinDataSource"/>
</bean> <!-- 配置ibatis -->
<bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
<property name="configLocation" value="classpath:SqlMapConfig.xml" />
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="sqlMapClientTemplate" class="org.springframework.orm.ibatis.SqlMapClientTemplate">
<property name="sqlMapClient" ref="sqlMapClient" />
</bean>
       .........................
  public class CurrentContextHolder {
private static final ThreadLocal<String> contextHolder = new ThreadLocal<String>(); public static void setDateSource(String dateSourceName) {
contextHolder.set(dateSourceName);
} public static String getDateSource() {
return (String)contextHolder.get();
} public static void clearDateSource() {
contextHolder.remove();
}
}
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource{ @Override
protected Object determineCurrentLookupKey() {
return CurrentContextHolder.getDateSource();
}
}

解决方案 »

  1.   

    奉命顶贴,你虽然更新了数据源  但你的Spring容器并没有重新读取
      

  2.   

    帮你顶贴,嘿嘿,如果确实不行的话你可以做多个sqlMapClient
    例如sqlMapClientzxin  sqlMapClientgidx我们一个项目就是这么做的
    然后在程序里传参确定是用哪个sqlMapClient  同时也请你帮我看看这个贴 EJB3.1的定时任务为什么总是不运行?
    我以前从来没用过ejb
      

  3.   

    搞这么sqlMapClient 应该是可行的 但是也麻烦
      

  4.   

    <bean id="dep"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName">
    <value>oracle.jdbc.driver.OracleDriver</value>
    </property>
    <property name="url">
    <value>jdbc:oracle:thin:@333.333.333.333:1521:vsopd</value>
    </property>
    <property name="username" value="dep" />
    <property name="password" value="dep" />
    </bean>
    <bean id="crm2"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName">
    <value>oracle.jdbc.driver.OracleDriver</value>
    </property>
    <property name="url">
    <value>jdbc:oracle:thin:@33.33.33.33:1521:ods2</value>
    </property>
    <property name="username" value="crm" />
    <property name="password" value="crm" />
    </bean>
    <bean id="crm1"
    class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName">
    <value>oracle.jdbc.driver.OracleDriver</value>
    </property>
    <property name="url">
    <value>jdbc:oracle:thin:@33.33.33.33:1521:ods1</value>
    </property>
    <property name="username" value="crm" />
    <property name="password" value="crm" />
    </bean> <!-- iBatis config -->
    <bean id="sqlMapClientDep" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
    <property name="configLocation" value="classpath:sqlmap-config.xml" />
    <property name="dataSource" ref="dep" />
    <property name="lobHandler" ref="oracleLobHandler" />
    </bean>
    <bean id="sqlMapClientCrm1" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
    <property name="configLocation" value="classpath:sqlmap-config.xml" />
    <property name="dataSource" ref="crm1" />
    <property name="lobHandler" ref="oracleLobHandler" />
    </bean>
    <bean id="sqlMapClientCrm2" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
    <property name="configLocation" value="classpath:sqlmap-config.xml" />
    <property name="dataSource" ref="crm2" />
    <property name="lobHandler" ref="oracleLobHandler" />
    </bean>电信crm域里的一个项目  ip被我改了
      

  5.   

    建议你用webservice来实现你的想法;
      

  6.   

    不同的数据源 配不同的sessionfactory 然后写DAO
      

  7.   

    这个方法貌似比较笨拙,spring提供了比较好的实现方法,那就是:AbstractRoutingDataSource,但是我这里的有问题没有搞出来...
      

  8.   

    还是webservice,省事一些。祝lz好运
      

  9.   

    没仔细看   
    你可以看看这个例子 
    http://qdjinxin.iteye.com/blog/364572
    实践过  没问题