日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
使用Spring解決ibatis多數(shù)據(jù)源的苦惱

iBatis多數(shù)據(jù)源的苦惱

10年積累的做網(wǎng)站、網(wǎng)站建設(shè)經(jīng)驗,可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認識你,你也不認識我。但先網(wǎng)站設(shè)計后付款的網(wǎng)站建設(shè)流程,更有老河口免費網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

在僅使用ibatis時,多數(shù)據(jù)源簡直就是夢魘,每多一個數(shù)據(jù)源就需要多一份sql-map-config配置文件。

采用spring的AbstractRoutingDataSource就可以簡單的解決這個問題。

AbstractRoutingDataSource實現(xiàn)了javax.sql.DataSource接口,因此可以理解為一個虛擬的動態(tài)DataSource,在需要的時候根據(jù)上下文Context動態(tài)決定使用哪個數(shù)據(jù)源。

Spring+iBatis多數(shù)據(jù)源的配置

下面是一個完整的配置:

 
 
 
  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.  

這樣在調(diào)用service之前只需要設(shè)置一下上下文即可調(diào)用相應(yīng)的數(shù)據(jù)源,如下:

 
 
 
  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多數(shù)據(jù)源的配置方案。本文來自eddysheng的博客:《基于spring和ibatis的多數(shù)據(jù)源切換方案》。


分享題目:使用Spring解決ibatis多數(shù)據(jù)源的苦惱
當(dāng)前路徑:http://www.dlmjj.cn/article/dphejch.html