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

           

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

              通常這種多數據源的邏輯會滲透到業務邏輯中,同時也會給我們使用的數據訪問API諸如Hibernate和iBatis等帶來不便(需要指定多個SessionFactory或SqlMapClient實例來對應多個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>

          posted on 2009-07-27 21:54 Werther 閱讀(4814) 評論(6)  編輯  收藏 所屬分類: 10.Java

          評論:
          # re: Spring多數據源解決方案 2009-07-28 09:35 | 揚帆出海
          是個不錯的方法,不過有些地方還是不明白。
          以前采用的方式是創建兩個sessionFactory,配置數據訪問類的時候選擇相應的sessionFactory。

          我有兩個問題:
          1)sql-map-config.xml里是什么內容
          2)String userId=(String)DbContextHolder.getContext();上下文中是怎么管理ID的?  回復  更多評論
            
          # re: Spring多數據源解決方案 2009-07-28 13:57 | 海邊沫沫
          不錯,收藏!  回復  更多評論
            
          # re: Spring多數據源解決方案 2009-07-28 22:19 | MyYate
          這個沒法保證事務啊,我如果要對其中兩個數據源進行更新操作,這種就不能實現了吧!  回復  更多評論
            
          # re: Spring多數據源解決方案 2009-07-29 09:13 | 和尚
          不錯,不過應該再詳細點就解答上面兩個網友的問題就最好了:一個是如何管理sessionFactory?是spring來管理嗎?底層實現了?另一個就是事務,如何細粒度事務?  回復  更多評論
            
          # re: Spring多數據源解決方案 2009-07-29 15:44 | lordz
          如果是MySQL+Oracle,sql-map-config.xml是不一樣的 那怎么配置呢?  回復  更多評論
            
          # re: Spring多數據源解決方案 [未登錄] 2009-12-01 13:23 | 懶貓
          如果各個dataSource上的數據庫結構不一樣的話,這個方法是不能解決問題的  回復  更多評論
            

          I'm reading...

          Java 60

          Head  First SQL

          寶貝連接


          If you need these books,pls send me emails.
          Email:kunpeng.niu@163.com
          <2009年7月>
          2829301234
          567891011
          12131415161718
          19202122232425
          2627282930311
          2345678

          留言簿(10)

          隨筆分類(178)

          隨筆檔案(208)

          文章檔案(1)

          新聞檔案(6)

          相冊

          1.Java Official Website

          2.Java Study Website

          3.Java Technic Website

          4.Java Video Website

          5.Database Website

          6.Bookshop Website

          7.English Website

          8.Friends Link

          9.Other Web

          積分與排名

          • 積分 - 685036
          • 排名 - 67

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 宜川县| 长宁区| 东平县| 安多县| 长沙市| 改则县| 和平县| 泾源县| 长子县| 祁门县| 漳浦县| 紫金县| 吉安县| 花垣县| 城口县| 南岸区| 志丹县| 伊川县| 济南市| 阳高县| 留坝县| 北流市| 穆棱市| 应用必备| 桑日县| 乐安县| 西安市| 阳西县| 内丘县| 许昌市| 静宁县| 舞阳县| 古蔺县| 方城县| 德令哈市| 阳朔县| 双柏县| 墨江| 卓资县| 化州市| 凤山市|