数据源是针对一个数据库 使用Spring解决ibatis多数据源的苦恼
使用Spring解决ibatis多数据源的苦恼
iBatis多数据源的苦恼
在仅使用ibatis时 多数据源简直就是梦魇 每多一个数据源就需要多一份sql map config配置文件
采用spring的AbstractRoutingDataSource就可以简单的解决这个问题
AbstractRoutingDataSource实现了javax sql DataSource接口 因此可以理解为一个虚拟的动态DataSource 在需要的时候根据上下文Context动态决定使用哪个数据源

Spring+iBatis多数据源的配置
下面是一个完整的配置
< beans xmlns= xmlns:xsi= instance xmlns:aop= xmlns:tx= xmlns:jee= xsi:schemaLocation= beans xsd aop xsd tx xsd jee xsd >
< ! ========================= GENERAL DEFINITIONS ========================= > < jee:jndi lookup id= ds jndi name= jdbc/ds /> < jee:jndi lookup id= ds jndi name= jdbc/ds /> < jee:jndi lookup id= ds jndi name= jdbc/ds />
< bean id= dataSource class= xxx xxx util DynamicDataSource > < property name= targetDataSources > < map key type= java lang String > < entry key= value ref= ds /> < entry key= value ref= ds /> < entry key= value ref= ds /> < /map> < /property> < property name= defaultTargetDataSource ref= /> < /bean> < ! SqlMap setup for iBATIS Database Layer > < bean id= sqlMapClient class= springframework orm ibatis SqlMapClientFactoryBean > < property name= dataSource ref= dataSource /> < property name= configLocation value= classpath:/xxx/xxx/dao/sqlmap/sql map config xml /> < /bean> < bean id= testDAO class= xxx xxx dao impl TestDAO > < property name= sqlMapClient ref= sqlMapClient /> < /bean> < bean id= testService class= xxx xxx service impl TestService > < property name= testDAO ref= testDAO /> < /bean>< /beans>
其核心是DynamicDataSource 代码如下
package xxx xxx util;
import apache log j Logger;import springframework jdbc datasource lookup AbstractRoutingDataSource;
public class DynamicDataSource extends AbstractRoutingDataSource {
static Logger log = Logger getLogger( DynamicDataSource ); @Override protected Object determineCurrentLookupKey() { // TODO Auto generated method stub return DbContextHolder getDbType(); }
}
上下文DbContextHolder为一线程安全的ThreadLocal 如下
package xxx xxx util;
public class DbContextHolder { private static final ThreadLocal contextHolder = new ThreadLocal();
public static void setDbType(String dbType) { contextHolder set(dbType); }
public static String getDbType() { return (String) contextHolder get(); }
public static void clearDbType() { contextHolder remove(); }}
sql map config xml如下
< ?xml version= encoding= UTF standalone= no ?>< !DOCTYPE sqlMapConfig PUBLIC ////DTD SQL Map Config //EN map config dtd >
< sqlMapConfig>
< sqlMap resource= /xxx/xxx/dao/sqlmap/Object xml />
< /sqlMapConfig>
这样在调用service之前只需要设置一下上下文即可调用相应的数据源 如下
DbContextHolder setDbType( );//execute services//
dao如下
package xxx xxx dao impl;
import java util HashMap;import java util List;import java util Map;
import apache log j Logger;import springframework orm ibatis support SqlMapClientDaoSupport;
import xxx xxx vo TestObj;
public class TestDAO extends SqlMapClientDaoSupport implements ITestDAO {
static Logger log = Logger getLogger(TestDAO class);
public TestObj getTestObj(String objID) throws Exception { return (TestObj) getSqlMapClientTemplate() queryForObject( getTestObj objID); }}
lishixinzhi/Article/program/Java/ky/201311/28536