真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

SpringMVCMybatis配置多個(gè)數(shù)據(jù)源并切換代碼詳解

這篇文章主要介紹了SpringMVC Mybatis配置多個(gè)數(shù)據(jù)源并切換代碼詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

網(wǎng)站建設(shè)哪家好,找創(chuàng)新互聯(lián)建站!專注于網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、成都小程序開發(fā)、集團(tuán)企業(yè)網(wǎng)站建設(shè)等服務(wù)項(xiàng)目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了東港免費(fèi)建站歡迎大家使用!

最近公司一個(gè)項(xiàng)目需要連接兩個(gè)數(shù)據(jù)庫(A和B)操作,有的模塊查詢A庫,有的模塊查詢B庫,因此需要改造下,項(xiàng)目后臺(tái)用的是SpringMVC+Mybatis+MySQL架構(gòu),折騰了兩天后終于搞定了,在這里記錄過改造過程。

使用場(chǎng)景

多數(shù)據(jù)源的使用的場(chǎng)景一般有:

  • 主從數(shù)據(jù)庫切換
  • 讀寫分離
  • 兼容舊庫

實(shí)現(xiàn)原理

Spring2.x的版本中采用Proxy模式,就是在方案中實(shí)現(xiàn)一個(gè)虛擬的數(shù)據(jù)源,并且用它來封裝數(shù)據(jù)源選擇邏輯,這樣就可以有效地將數(shù)據(jù)源選擇邏輯從Client中分離出來。Client提供選擇所需的上下文,由虛擬的DynamicDataSource根據(jù)Client提供的上下文來實(shí)現(xiàn)數(shù)據(jù)源的選擇。

具體的實(shí)現(xiàn)是虛擬的DynamicDataSource僅需繼承AbstractRoutingDataSource實(shí)現(xiàn)determineCurrentLookupKey(),該方法返回需要使用的DataSource的key值,然后根據(jù)這個(gè)key從resolvedDataSources這個(gè)map里取出對(duì)應(yīng)的DataSource,如果找不到則用默認(rèn)的resolvedDefaultDataSource。

詳細(xì)實(shí)現(xiàn)過程

修改spring的配置文件

配置文件里需要配置多個(gè)數(shù)據(jù)源,改造后主要配置如下:

  
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  

  
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
  
  
  
    
      
        
        
      
    
    
    
  
  

  
    
  
  

  
  
    
    
      
        classpath*:com/test/**/*Mapper.xml
      
    
    
  

添加動(dòng)態(tài)數(shù)據(jù)源管理類

DynamicDataSource類繼承AbstractRoutingDataSource,實(shí)現(xiàn)determineCurrentLookupKey()方法。

package com.test.util;
import com.test.util.CustomerContextHolder;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;

/**
 * 動(dòng)態(tài)數(shù)據(jù)源管理類
 *
 */
public class DynamicDataSource extends AbstractRoutingDataSource {

  @Override
  protected Object determineCurrentLookupKey() {
    return CustomerContextHolder.getCustomerType();
  }
}

數(shù)據(jù)源切換類

CustomerContextHolder類可以實(shí)現(xiàn)數(shù)據(jù)源A和B的切換,數(shù)據(jù)源標(biāo)識(shí)保存在線程變量中,避免多線程操作數(shù)據(jù)源時(shí)互相干擾

package com.test.util;
/**
 * 數(shù)據(jù)源切換類
 *
 */
public class CustomerContextHolder {
  public static final String DATA_SOURCE_DEFAULT = "dataSourceTargetA";
  public static final String DATA_SOURCE_B = "dataSourceTargetB";
  private static final ThreadLocal contextHolder = new ThreadLocal();
  public static void setCustomerType(String customerType) {
    contextHolder.set(customerType);
  }
  public static String getCustomerType() {
    return contextHolder.get();
  }
  public static void clearCustomerType() {
    contextHolder.remove();
  }
}

使用多數(shù)據(jù)源代碼

下面是Controller層代碼,需要查詢B數(shù)據(jù)源,查詢完成后切換為默認(rèn)數(shù)據(jù)源A,具體代碼如下:

/**
   * 訂單列表查詢,查詢B數(shù)據(jù)源
   *
   * @param request
   * @return
   */
  @RequestMapping(value = "/list")
  public String list(HttpServletRequest request, Integer cId) {
    //設(shè)置數(shù)據(jù)源B
    CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_B);
    List orderList = salaryBillService.getSalaryOrderByOrgId(cId);
    request.setAttribute("orderList", orderList);
    //切換回默認(rèn)數(shù)據(jù)源A
    CustomerContextHolder.setCustomerType(CustomerContextHolder.DATA_SOURCE_DEFAULT);
    return "/jsp/order";
  }

上述四步操作完成后即可實(shí)現(xiàn)SpringMVC+Mybatis配置多個(gè)數(shù)據(jù)源并切換,有問題歡迎留言溝通哦!

以上就是本文的全部內(nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持創(chuàng)新互聯(lián)。


網(wǎng)站欄目:SpringMVCMybatis配置多個(gè)數(shù)據(jù)源并切換代碼詳解
文章鏈接:http://weahome.cn/article/godses.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部