J2EE之巔

           

          Spring多數據源解決方案

           

          在很多大型應用中都會對數據進行切分,并且采用多個數據庫實例進行管理,這樣可以有效提高系統的水平伸縮性。而這樣的方案就會不同于常見的單一數據實例的方案,這就要程序在運行時根據當時的請求及系統狀態來動態的決定將數據存儲在哪個數據庫實例中,以及從哪個數據庫提取數據。

          Figure 1 數據分割及多數據庫架構

          通常這種多數據源的邏輯會滲透到業務邏輯中,同時也會給我們使用的數據訪問API諸如HibernateiBatis等帶來不便(需要指定多個SessionFactorySqlMapClient實例來對應多個DataSource)。


          Figure 2 多數據源的選擇邏輯滲透至客戶端

          解決方案


          Figure 3 采用Proxy模式來封裝數據源選擇邏輯

          通過采用Proxy模式我們在方案中實現一個虛擬的數據源,并且用它來封裝數據源選擇邏輯,這樣就可以有效地將數據源選擇邏輯從Client中分離出來。

          Client提供選擇所需的上下文(因為這是Client所知道的),由虛擬的DataSource根據Client提供的上下文來實現數據源的選擇。

          Spring2.x的版本中提供了實現這種方式的基本框架,虛擬的DataSource僅需繼承AbstractRoutingDataSource實現determineCurrentLookupKey()在其中封裝數據源的選擇邏輯。

          實例:

          publicclass DynamicDataSource extends AbstractRoutingDataSource {

                static Logger log = Logger.getLogger("DynamicDataSource");

                @Override

                protected Object determineCurrentLookupKey() {

                      String userId=(String)DbContextHolder.getContext();

                      Integer dataSourceId=getDataSourceIdByUserId(userId);      

                      return dataSourceId;

                }

          }

          實例中通過UserId來決定數據存放在哪個數據庫中。

          配置文件示例:

          <bean id="dataSource" class="com.bitfone.smartdm.datasource.DynamicDataSource"> 

                        <property name="targetDataSources"> 

                           <map key-type="java.lang.Integer"> 

                              <entry key="0" value-ref="dataSource0"/>

                              <entry key="1" value-ref="dataSource1"/>

                              <entry key="2" value-ref="dataSource2"/> 

                           </map> 

                        </property> 

                        <property name="defaultTargetDataSource" ref="dataSource0"/> 

                      </bean>

                      <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">

                          <property name="configLocation" value="classpath:com/bitfone/smartdm/dao/sqlmap/sql-map-config.xml"/>

                          <property name="dataSource" ref="dataSource"/>

                     </bean>

                      <bean id="UserInfoDAO" class="com.bitfone.smartdm.dao.impl.UserInfoDAO">

                           

                            <property name="sqlMapClient" ref="sqlMapClient"/>

                      </bean>

          蔡超
          HP 軟件架構師
          軟件架構顧問
          SCEA
          IBM Certified Solution Designer for OOA&D vUML2
          Chaocai2001@yahoo.com.cn

          posted on 2009-07-05 21:53 超越巔峰 閱讀(5153) 評論(10)  編輯  收藏

          評論

          # re: Spring多數據源解決方案[未登錄] 2009-07-05 22:36 summer

          可以試試這個http://amoeba.meidusa.com/wordpress/  回復  更多評論   

          # re: Spring多數據源解決方案 2009-07-05 23:30 凡客誠品

          看得不太明白!!  回復  更多評論   

          # re: Spring多數據源解決方案 2009-07-05 23:53 subtitle

          不錯  回復  更多評論   

          # re: Spring多數據源解決方案 2009-07-06 01:12 MyYate

          AbstractRoutingDataSource對于多數據源訪問可以使用,但是如果需要對多數據源進行update操作,還是要借助于jta來控制,lz有其他方法否?  回復  更多評論   

          # re: Spring多數據源解決方案 2009-07-06 10:16 awed

          看得不太明白,這樣對單用戶儲存是解決問題了,但是如果要對數據的統計和管理呢?又如何處理,總不至于把存在所有數據庫里的數據全取出來再分頁做吧,還有一些情況,像對于同一用戶,可能是需要搞作兩個數據源,這種情況又如何對待?  回復  更多評論   

          # re: Spring多數據源解決方案 2009-07-06 10:53 99讀書人

          不錯
          1  回復  更多評論   

          # re: Spring多數據源解決方案 2009-07-22 13:02 Hibernate方言怎么解決

          Hibernate方言怎么辦  回復  更多評論   

          # re: Spring多數據源解決方案[未登錄] 2009-10-23 16:47 bs

          轉載 還打上自己名字..........歷害  回復  更多評論   

          # re: Spring多數據源解決方案 2009-10-23 17:43 超越巔峰

          @bs
          你看錯了吧,兄弟,這是我的文章,是別人轉載我的  回復  更多評論   

          # re: Spring多數據源解決方案 2012-12-27 15:21 時磊

          請問兄弟,線程安全嗎?我按你的思路弄出來了,但是擔心線程安全的問題,怎么驗證?  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           

          導航

          統計

          常用鏈接

          留言簿(12)

          隨筆分類(54)

          隨筆檔案(59)

          文章分類(2)

          文章檔案(1)

          相冊

          搜索

          積分與排名

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 遂宁市| 喀什市| 万山特区| 阳东县| 蒙山县| 澜沧| 恩施市| 和平县| 南开区| 如东县| 白城市| 丰顺县| 金阳县| 聂拉木县| 庆元县| 永康市| 本溪市| 哈尔滨市| 武乡县| 册亨县| 八宿县| 盐亭县| 许昌县| 普兰店市| 青河县| 边坝县| 醴陵市| 虞城县| 洛南县| 嘉鱼县| 金平| 云梦县| 温泉县| 海丰县| 维西| 涞水县| 卢龙县| 凤台县| 天台县| 镇平县| 宣恩县|