使用Spring解决ibatis多数据源的苦恼

iBatis多数据源的苦恼

10年积累的做网站、网站建设经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先网站设计后付款的网站建设流程,更有老河口免费网站建设让你可以放心的选择与我们合作。

在仅使用ibatis时,多数据源简直就是梦魇,每多一个数据源就需要多一份sql-map-config配置文件。

采用spring的AbstractRoutingDataSource就可以简单的解决这个问题。

AbstractRoutingDataSource实现了javax.sql.DataSource接口,因此可以理解为一个虚拟的动态DataSource,在需要的时候根据上下文Context动态决定使用哪个数据源。

Spring+iBatis多数据源的配置

下面是一个完整的配置:

 
 
 
  1. < beans xmlns="http://www.springframework.org/schema/beans"
  2.   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  3.   xmlns:aop="http://www.springframework.org/schema/aop"
  4.   xmlns:tx="http://www.springframework.org/schema/tx"
  5.   xmlns:jee="http://www.springframework.org/schema/jee"
  6.   xsi:schemaLocation="
  7.    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
  8.    http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
  9.    http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
  10.    http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-2.5.xsd">
  11.  < !-- ========================= GENERAL DEFINITIONS ========================= -->
  12.  < jee:jndi-lookup id="ds0" jndi-name="jdbc/ds0"/>
  13.  < jee:jndi-lookup id="ds1" jndi-name="jdbc/ds1"/>
  14.  < jee:jndi-lookup id="ds2" jndi-name="jdbc/ds2"/>
  15.  
  16.  < bean id="dataSource" class="com.xxx.xxx.util.DynamicDataSource">  
  17.          < property name="targetDataSources">  
  18.             < map key-type="java.lang.String">  
  19.                < entry key="0" value-ref="ds0"/>
  20.                < entry key="1" value-ref="ds1"/>
  21.                < entry key="2" value-ref="ds2"/>  
  22.             < /map>  
  23.          < /property>  
  24.          < property name="defaultTargetDataSource" ref="1"/>  
  25.  < /bean>
  26.         < !-- SqlMap setup for iBATIS Database Layer -->
  27.  < bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
  28.   < property name="dataSource" ref="dataSource"/>
  29.   < property name="configLocation" value="classpath:com/xxx/xxx/dao/sqlmap/sql-map-config.xml"/>
  30.  < /bean>
  31.         < bean id="testDAO" class="com.xxx.xxx.dao.impl.TestDAO">
  32.   < property name="sqlMapClient" ref="sqlMapClient"/>
  33.  < /bean>
  34.         < bean id="testService" class="com.xxx.xxx.service.impl.TestService">
  35.   < property name="testDAO" ref="testDAO"/>
  36.  < /bean>
  37. < /beans>
  38.  

其核心是DynamicDataSource,代码如下

 
 
 
  1. package com.xxx.xxx.util;
  2. import org.apache.log4j.Logger;
  3. import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
  4. public class DynamicDataSource extends AbstractRoutingDataSource {
  5.  static Logger log = Logger.getLogger("DynamicDataSource");
  6.  @Override
  7.  protected Object determineCurrentLookupKey() {
  8.   // TODO Auto-generated method stub
  9.   return DbContextHolder.getDbType();
  10.  }
  11. }

上下文DbContextHolder为一线程安全的ThreadLocal,如下

 
 
 
  1. package com.xxx.xxx.util;
  2. public class DbContextHolder {
  3.  private static final ThreadLocal contextHolder = new ThreadLocal();
  4.  public static void setDbType(String dbType) {
  5.   contextHolder.set(dbType);
  6.  }
  7.  public static String getDbType() {
  8.   return (String) contextHolder.get();
  9.  }
  10.  public static void clearDbType() {
  11.   contextHolder.remove();
  12.  }
  13. }
  14.  

sql-map-config.xml如下

 
 
 
  1. < ?xml version="1.0" encoding="UTF-8" standalone="no"?>
  2. < !DOCTYPE sqlMapConfig PUBLIC "-//iBATIS.com//DTD SQL Map Config 2.0//EN"
  3.         "http://www.ibatis.com/dtd/sql-map-config-2.dtd">
  4. < sqlMapConfig>
  5.     < sqlMap resource="com/xxx/xxx/dao/sqlmap/Object.xml"/>
  6. < /sqlMapConfig>
  7.  

这样在调用service之前只需要设置一下上下文即可调用相应的数据源,如下:

 
 
 
  1. DbContextHolder.setDbType("2");
  2. //execute services
  3. //.........

dao如下

 
 
 
  1. package com.xxx.xxx.dao.impl;
  2. import java.util.HashMap;
  3. import java.util.List;
  4. import java.util.Map;
  5. import org.apache.log4j.Logger;
  6. import org.springframework.orm.ibatis.support.SqlMapClientDaoSupport;
  7. import com.xxx.xxx.vo.TestObj;
  8. public class TestDAO extends SqlMapClientDaoSupport implements ITestDAO {
  9.     static Logger log = Logger.getLogger(TestDAO.class);
  10.     public TestObj getTestObj(String objID) throws Exception {
  11.         return (TestObj) getSqlMapClientTemplate().queryForObject("getTestObj", objID);
  12.     }
  13. }

以上就介绍了Spring+iBatis多数据源的配置方案。本文来自eddysheng的博客:《基于spring和ibatis的多数据源切换方案》。

当前标题:使用Spring解决ibatis多数据源的苦恼
本文路径:http://www.shufengxianlan.com/qtweb/news28/300128.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联