JAVA认证:使用Spring解决ibatis多数据源的苦恼
来源:优易学  2011-9-12 10:44:37   【优易学:中国教育考试门户网】   资料下载   IT书店

  iBatis多数据源的苦恼
  在仅使用ibatis时,多数据源简直就是梦魇,每多一个数据源就需要多一份sql-map-config配置文件。
  采用spring的AbstractRoutingDataSource就可以简单的解决这个问题。
  AbstractRoutingDataSource实现了javax.sql.DataSource接口,因此可以理解为一个虚拟的动态DataSource,在需要的时候根据上下文Context动态决定使用哪个数据源。
  Spring+iBatis多数据源的配置
  下面是一个完整的配置:
  < beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xmlns:tx="http://www.springframework.org/schema/tx"
  xmlns:jee="http://www.springframework.org/schema/jee"
  xsi:schemaLocation="
  http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
  http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
  http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">
  < !-- ========================= GENERAL DEFINITIONS ========================= -->
  < jee:jndi-lookup id="ds0" jndi-name="jdbc/ds0"/>
  < jee:jndi-lookup id="ds1" jndi-name="jdbc/ds1"/>
  < jee:jndi-lookup id="ds2" jndi-name="jdbc/ds2"/>
  < bean id="dataSource" class="com.xxx.xxx.util.DynamicDataSource">
  < property name="targetDataSources">
  < map key-type="java.lang.String">
  < entry key="0" value-ref="ds0"/>
  < entry key="1" value-ref="ds1"/>
  < entry key="2" value-ref="ds2"/>
  < /map>
  < /property>
  < property name="defaultTargetDataSource" ref="1"/>
  < /bean>
  < !-- SqlMap setup for iBATIS Database Layer -->
  < bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
  < property name="dataSource" ref="dataSource"/>
  < property name="configLocation" value="classpath:com/xxx/xxx/dao/sqlmap/sql-map-config.xml"/>
  < /bean>
  < bean id="testDAO" class="com.xxx.xxx.dao.impl.TestDAO">
  < property name="sqlMapClient" ref="sqlMapClient"/>
  < /bean>
  < bean id="testService" class="com.xxx.xxx.service.impl.TestService">
  < property name="testDAO" ref="testDAO"/>
  < /bean>
  < /beans>
  其核心是DynamicDataSource,代码如下
  package com.xxx.xxx.util;
  import org.apache.log4j.Logger;
  import org.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 com.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="1.0" encoding="UTF-8" standalone="no"?>
  < !DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
  "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
  < sqlMapConfig>
  < sqlMap resource="com/xxx/xxx/dao/sqlmap/Object.xml"/>
  < /sqlMapConfig>
  这样在调用service之前只需要设置一下上下文即可调用相应的数据源,如下:
  DbContextHolder.setDbType("2");
  //execute services
  //.........
  dao如下
  package com.xxx.xxx.dao.impl;
  import java.util.HashMap;
  import java.util.List;
  import java.util.Map;
  import org.apache.log4j.Logger;
  import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
  import com.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);
  }
  }
  以上就介绍了Spring+iBatis多数据源的配置方案。

责任编辑:小草

文章搜索:
 相关文章
热点资讯
资讯快报
热门课程培训