<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-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 閱讀(4820) 評論(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上的數據庫結構不一樣的話,這個方法是不能解決問題的  回復  更多評論
      
    主站蜘蛛池模板: 91老湿机福利免费体验| 亚洲一区二区三区91| 免费精品久久久久久中文字幕| 精品福利一区二区三区免费视频| 亚洲va无码专区国产乱码| 丝袜捆绑调教视频免费区| 国产精品亚洲精品日韩已方 | 久久乐国产精品亚洲综合| 青娱乐在线免费观看视频| 四虎国产精品免费视| 美女被艹免费视频| 亚洲麻豆精品国偷自产在线91| 一个人看的免费观看日本视频www 一个人看的免费视频www在线高清动漫 | 成人片黄网站色大片免费观看cn| 成人免费无毒在线观看网站 | 一本久到久久亚洲综合| 69av免费视频| 亚洲制服丝袜中文字幕| 永久免费无码网站在线观看| 亚洲av日韩综合一区二区三区 | 日日麻批免费40分钟无码| 亚洲综合久久久久久中文字幕| 91热成人精品国产免费| 亚洲砖码砖专无区2023| 日韩亚洲精品福利| a毛片视频免费观看影院| 久久精品国产亚洲AV嫖农村妇女 | 黄页网站在线观看免费高清| 亚洲性色AV日韩在线观看 | 久久久久久a亚洲欧洲AV| 久草视频免费在线| 国产亚洲福利精品一区二区| 国产亚洲精品自在久久| 中文字幕无码视频手机免费看| 免费精品国产自产拍在线观看 | 国产亚洲综合久久系列| 成年女人免费v片| 日本免费A级毛一片| 在线a亚洲老鸭窝天堂av高清| 亚洲国产精品人人做人人爽 | 国产成人免费ā片在线观看|