Chris Lamey wrote:
> 
> That should work ok, that Map could get modified at servlet init time.
> 

Drat, doesn't appear to, at least not how I've written it. I think there are
two problems - first, the map is already set by the time my servlet gets
created and a call to setTargetDataSources will not overwrite it. Second,
the map is String to String, rather than a key to a dataSource name. But I
don't know how to give my dataSource a name in the context when it doesn't
come from a config file.

Here's what I did - maybe I did something stupid:

my bean def:
   <bean id="mediusDataSource" class="MediusRoutingDataSource">
      <property name="targetDataSources">
          <map>
        <entry key="medius1" value-ref="mediusSource" />
        <entry key="medius2" value-ref="oldSource" />
          </map>
      </property>
   </bean>

public class MediusRoutingDataSource extends AbstractRoutingDataSource
{
        protected static boolean didOnce = false;
        
        @Override
        protected Object determineCurrentLookupKey()
        {
                if (didOnce)    return "xxxMedius";
                else    { didOnce = true; return "medius2";}
        }
}

test code:
        public void testGetBanPoliciesFromDifferentSource()
        {
                BanPolicyManager mgr = 
(BanPolicyManager)ctx.getBean("banPolicyDAO");
                System.out.println(mgr.fetchBanPolicies()); // uses 'medius2' 
datasource,
returns empty list

                BasicDataSource newDS = new BasicDataSource();
                newDS.setUsername("psanders");
                newDS.setUrl("jdbc:oracle:thin:@toad002:1521:sid");
                newDS.setPassword("psanders");
                newDS.setDriverClassName("oracle.jdbc.driver.OracleDriver");
                
                MediusRoutingDataSource mds =
(MediusRoutingDataSource)ctx.getBean("mediusDataSource");
                // some code omitted to create a Map<String, BasicDataSource>
                routingMap.put("xxxMedius", newDS); // add new datasource to 
the routing
map
                mds.setTargetDataSources(routingMap);

                System.out.println(mgr.fetchBanPolicies()); // now uses 
'xxxMedius'
datasource
                // exception raised java.lang.IllegalStateException: Cannot 
determine
target DataSource for lookup key [xxxMedius]
        }
-- 
View this message in context: 
http://www.nabble.com/How-can-I-change-datasource-connect-info-on-the-fly-w-iBATIS-and-Spring--tf3573169.html#a10047766
Sent from the iBATIS - User - Java mailing list archive at Nabble.com.

Reply via email to