欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring實現(xiàn)動態(tài)切換多數(shù)據(jù)源的解決方案

 更新時間:2017年01月17日 11:20:13   作者:nevergiveupzeng  
這篇文章主要給大家介紹了Spring實現(xiàn)動態(tài)切換多數(shù)據(jù)源的解決方案,文中給出了詳細的介紹和示例代碼,相信對大家的理解和學(xué)習(xí)具有一定的參考借鑒價值,有需要的朋友可以參考學(xué)習(xí),下面來一起看看吧。

前言

Spring動態(tài)配置多數(shù)據(jù)源,即在大型應(yīng)用中對數(shù)據(jù)進行切分,并且采用多個數(shù)據(jù)庫實例進行管理,這樣可以有效提高系統(tǒng)的水平伸縮性。而這樣的方案就會不同于常見的單一數(shù)據(jù)實例的方案,這就要程序在運行時根據(jù)當(dāng)時的請求及系統(tǒng)狀態(tài)來動態(tài)的決定將數(shù)據(jù)存儲在哪個數(shù)據(jù)庫實例中,以及從哪個數(shù)據(jù)庫提取數(shù)據(jù)。

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

實現(xiàn)

具體的實現(xiàn)就是,虛擬的DataSource僅需繼承AbstractRoutingDataSource實現(xiàn)determineCurrentLookupKey()在其中封裝數(shù)據(jù)源的選擇邏輯。

一、動態(tài)配置多數(shù)據(jù)源

1. 數(shù)據(jù)源的名稱常量類:

/** 
 * 動態(tài)配置多數(shù)據(jù)源 
 * 數(shù)據(jù)源的名稱常量類 
 * @author LONGHUI_LUO 
 * 
 */ 
public class DataSourceConst { 
 public static final String TEST="test"; 
 public static final String USER="User"; 
} 

2. 建立一個獲得和設(shè)置上下文環(huán)境的類,主要負責(zé)改變上下文數(shù)據(jù)源的名稱:

/** 
 * 獲得和設(shè)置上下文環(huán)境 主要負責(zé)改變上下文數(shù)據(jù)源的名稱 
 * 
 * @author LONGHUI_LUO 
 * 
 */ 
public class DataSourceContextHolder { 
 private static final ThreadLocal contextHolder = new ThreadLocal(); // 線程本地環(huán)境 
 
 // 設(shè)置數(shù)據(jù)源類型 
 public static void setDataSourceType(String dataSourceType) { 
  contextHolder.set(dataSourceType); 
 } 
 
 // 獲取數(shù)據(jù)源類型 
 public static String getDataSourceType() { 
  return (String) contextHolder.get(); 
 } 
 
 // 清除數(shù)據(jù)源類型 
 public static void clearDataSourceType() { 
  contextHolder.remove(); 
 } 
 
} 

3. 建立動態(tài)數(shù)據(jù)源類,注意,這個類必須繼承AbstractRoutingDataSource,且實現(xiàn)方法determineCurrentLookupKey,該方法返回一個Object,一般是返回字符串:

/** 
 * 建立動態(tài)數(shù)據(jù)源 
 * 
 * @author LONGHUI_LUO 
 * 
 */ 
public class DynamicDataSource extends AbstractRoutingDataSource { 
 
 protected Object determineCurrentLookupKey() { 
 // 在進行DAO操作前,通過上下文環(huán)境變量,獲得數(shù)據(jù)源的類型 
 return DataSourceContextHolder.getDataSourceType(); 
 } 
 
} 

4. 編寫spring的配置文件配置多個數(shù)據(jù)源

  <!-- 數(shù)據(jù)源相同的內(nèi)容 --> 
<bean 
  id="parentDataSource" 
  class="org.apache.commons.dbcp.BasicDataSource" 
  destroy-method="close"> 
  <property 
   name="driverClassName" 
   value="com.microsoft.sqlserver.jdbc.SQLServerDriver" /> 
  <property name="username" value="sa" /> 
  <property name="password" value="net2com" /> 
</bean> 
<!-- start以下配置各個數(shù)據(jù)源的特性 --> 
<bean parent="parentDataSource" id="testDataSource"> 
  <propertynamepropertyname="url" value="jdbc:sqlserver://localhost:1433;databaseName=test" /> 
</bean> 
<bean parent="parentDataSource" id="UserDataSource"> 
   <property 
   name="url" 
   value="jdbc:sqlserver://localhost:1433;databaseName=User" /> 
</bean> 
<!-- end 配置各個數(shù)據(jù)源的特性 --> 

5. 編寫spring配置文件配置多數(shù)據(jù)源映射關(guān)系

<bean class="com.xxxx.datasouce.DynamicDataSource" id="dataSource"> 
 <property name="targetDataSources"> 
  <map key-type="java.lang.String"> 
   <entry value-ref="testDataSource" key="test"></entry> 
   <entry value-ref="UserDataSource" key="User"></entry> 
  </map> 
 </property> 
 <property name="defaultTargetDataSource" ref="testDataSource" ></property> 
</bean> 

在這個配置中第一個property屬性配置目標(biāo)數(shù)據(jù)源,<map key-type="java.lang.String">中的key-type必須要和靜態(tài)鍵值對照類DataSourceConst中的值的類型相 同;<entry key="User" value-ref="userDataSource"/>中key的值必須要和靜態(tài)鍵值對照類中的值相同,如果有多個值,可以配置多個< entry>標(biāo)簽。第二個property屬性配置默認(rèn)的數(shù)據(jù)源。

動態(tài)切換是數(shù)據(jù)源

DataSourceContextHolder.setDataSourceType(DataSourceConst.TEST); 

該方案的優(yōu)勢

首先,這個方案完全是在spring的框架下解決的,數(shù)據(jù)源依然配置在spring的配置文件中,sessionFactory依然去配置它的dataSource屬性,它甚至都不知道dataSource的改變。唯一不同的是在真正的dataSource與sessionFactory之間增加了一個MultiDataSource。

其次,實現(xiàn)簡單,易于維護。這個方案雖然我說了這么多東西,其實都是分析,真正需要我們寫的代碼就只有MultiDataSource、SpObserver兩個類。MultiDataSource類真正要寫的只有getDataSource()getDataSource(sp)兩個方法,而SpObserver類更簡單了。實現(xiàn)越簡單,出錯的可能就越小,維護性就越高。

最后,這個方案可以使單數(shù)據(jù)源與多數(shù)據(jù)源兼容。這個方案完全不影響B(tài)US和DAO的編寫。如果我們的項目在開始之初是單數(shù)據(jù)源的情況下開發(fā),隨著項目的進行,需要變更為多數(shù)據(jù)源,則只需要修改spring配置,并少量修改MVC層以便在請求中寫入需要的數(shù)據(jù)源名,變更就完成了。如果我們的項目希望改回單數(shù)據(jù)源,則只需要簡單修改配置文件。這樣,為我們的項目將增加更多的彈性。

該方案的缺點

沒有能夠解決多用戶訪問單例“sessionFactory”時共享“dataSource”變量,導(dǎo)致產(chǎn)生爭搶“dataSource”的結(jié)果,本質(zhì)類似于操作系統(tǒng)中的“生產(chǎn)者消費者”問題。因此當(dāng)多用戶訪問時,多數(shù)據(jù)源可能會導(dǎo)致系統(tǒng)性能下降的后果。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流。

相關(guān)文章

  • Java實現(xiàn)文件上傳至服務(wù)器的方法

    Java實現(xiàn)文件上傳至服務(wù)器的方法

    這篇文章主要為大家詳細介紹了Java實現(xiàn)文件上傳至服務(wù)器的方法,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • Java并發(fā)中的ABA問題學(xué)習(xí)與解決方案

    Java并發(fā)中的ABA問題學(xué)習(xí)與解決方案

    這篇文章主要介紹了Java并發(fā)中的ABA問題學(xué)習(xí)與解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • MyBatis XML方式的基本用法之多表查詢功能的示例代碼

    MyBatis XML方式的基本用法之多表查詢功能的示例代碼

    這篇文章主要介紹了MyBatis XML方式的基本用法之多表查詢功能的示例代碼,本文通過示例文字相結(jié)合的形式給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-07-07
  • SpringBoot結(jié)合JWT實現(xiàn)用戶登錄、注冊、鑒權(quán)

    SpringBoot結(jié)合JWT實現(xiàn)用戶登錄、注冊、鑒權(quán)

    用戶登錄、注冊及鑒權(quán)是我們基本所有系統(tǒng)必備的,也是很核心重要的一塊,本文主要介紹了SpringBoot結(jié)合JWT實現(xiàn)用戶登錄、注冊、鑒權(quán),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2023-05-05
  • SSH框架網(wǎng)上商城項目第17戰(zhàn)之購物車基本功能

    SSH框架網(wǎng)上商城項目第17戰(zhàn)之購物車基本功能

    這篇文章主要為大家詳細介紹了SSH框架網(wǎng)上商城項目第17戰(zhàn)之購物車基本功能的實現(xiàn)過程,感興趣的小伙伴們可以參考一下
    2016-06-06
  • Java的invoke方法的具體使用

    Java的invoke方法的具體使用

    本文主要介紹了Java的invoke方法的具體使用,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-07-07
  • mybatisplus添加真正的批量新增、批量更新的實現(xiàn)

    mybatisplus添加真正的批量新增、批量更新的實現(xiàn)

    這篇文章主要介紹了mybatisplus添加真正的批量新增、批量更新的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-03-03
  • 利用Spring IOC技術(shù)實現(xiàn)用戶登錄驗證機制

    利用Spring IOC技術(shù)實現(xiàn)用戶登錄驗證機制

    這篇文章主要為大家詳細介紹了Spring IOC技術(shù)實現(xiàn)用戶登錄驗證機制的相關(guān)資料,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-10-10
  • Java項目向Maven遷移的實戰(zhàn)示例

    Java項目向Maven遷移的實戰(zhàn)示例

    本文主要介紹了Java項目向Maven遷移實戰(zhàn)指南,提升自動化構(gòu)建、依賴管理和項目信息管理的能力,具有一定的參考價值,感興趣的可以了解一下
    2025-07-07
  • MybatisPlus 主鍵策略的幾種實現(xiàn)方法

    MybatisPlus 主鍵策略的幾種實現(xiàn)方法

    MybatisPlus-Plus支持多種主鍵生成策略,可以通過@TableId注解的type屬性配置,主要策略包括AUTO、INPUT、ASSING_ID、ASSING_UUID和NONE,每種策略適用于不同的場景,下面就來介紹一下
    2024-10-10

最新評論