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

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

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

    隨筆-199  評(píng)論-203  文章-11  trackbacks-0
     在很多大型應(yīng)用中都會(huì)對(duì)數(shù)據(jù)進(jìn)行切分,并且采用多個(gè)數(shù)據(jù)庫(kù)實(shí)例進(jìn)行管理,這樣可以有效提高系統(tǒng)的水平伸縮性。而這樣的方案就會(huì)不同于常見的單一數(shù)據(jù)實(shí)例的方案,這就要程序在運(yùn)行時(shí)根據(jù)當(dāng)時(shí)的請(qǐng)求及系統(tǒng)狀態(tài)來(lái)動(dòng)態(tài)的決定將數(shù)據(jù)存儲(chǔ)在哪個(gè)數(shù)據(jù)庫(kù)實(shí)例中,以及從哪個(gè)數(shù)據(jù)庫(kù)提取數(shù)據(jù)。

     

    Figure 1 數(shù)據(jù)分割及多數(shù)據(jù)庫(kù)架構(gòu)

        通常這種多數(shù)據(jù)源的邏輯會(huì)滲透到業(yè)務(wù)邏輯中,同時(shí)也會(huì)給我們使用的數(shù)據(jù)訪問(wèn)API諸如Hibernate和iBatis等帶來(lái)不便(需要指定多個(gè)SessionFactory或SqlMapClient實(shí)例來(lái)對(duì)應(yīng)多個(gè)DataSource)。


    Figure 2 多數(shù)據(jù)源的選擇邏輯滲透至客戶端

     

        解決方案


    Figure 3 采用Proxy模式來(lái)封裝數(shù)據(jù)源選擇邏輯

        通過(guò)采用Proxy模式我們?cè)诜桨钢袑?shí)現(xiàn)一個(gè)虛擬的數(shù)據(jù)源,并且用它來(lái)封裝數(shù)據(jù)源選擇邏輯,這樣就可以有效地將數(shù)據(jù)源選擇邏輯從Client中分離出來(lái)。

        Client提供選擇所需的上下文(因?yàn)檫@是Client所知道的),由虛擬的DataSource根據(jù)Client提供的上下文來(lái)實(shí)現(xiàn)數(shù)據(jù)源的選擇。

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

        實(shí)例:

    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;

          }

    }

        實(shí)例中通過(guò)UserId來(lái)決定數(shù)據(jù)存放在哪個(gè)數(shù)據(jù)庫(kù)中。

        配置文件示例:

    <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 閱讀(4811) 評(píng)論(6)  編輯  收藏 所屬分類: 10.Java

    評(píng)論:
    # re: Spring多數(shù)據(jù)源解決方案 2009-07-28 09:35 | 揚(yáng)帆出海
    是個(gè)不錯(cuò)的方法,不過(guò)有些地方還是不明白。
    以前采用的方式是創(chuàng)建兩個(gè)sessionFactory,配置數(shù)據(jù)訪問(wèn)類的時(shí)候選擇相應(yīng)的sessionFactory。

    我有兩個(gè)問(wèn)題:
    1)sql-map-config.xml里是什么內(nèi)容
    2)String userId=(String)DbContextHolder.getContext();上下文中是怎么管理ID的?  回復(fù)  更多評(píng)論
      
    # re: Spring多數(shù)據(jù)源解決方案 2009-07-28 13:57 | 海邊沫沫
    不錯(cuò),收藏!  回復(fù)  更多評(píng)論
      
    # re: Spring多數(shù)據(jù)源解決方案 2009-07-28 22:19 | MyYate
    這個(gè)沒法保證事務(wù)啊,我如果要對(duì)其中兩個(gè)數(shù)據(jù)源進(jìn)行更新操作,這種就不能實(shí)現(xiàn)了吧!  回復(fù)  更多評(píng)論
      
    # re: Spring多數(shù)據(jù)源解決方案 2009-07-29 09:13 | 和尚
    不錯(cuò),不過(guò)應(yīng)該再詳細(xì)點(diǎn)就解答上面兩個(gè)網(wǎng)友的問(wèn)題就最好了:一個(gè)是如何管理sessionFactory?是spring來(lái)管理嗎?底層實(shí)現(xiàn)了?另一個(gè)就是事務(wù),如何細(xì)粒度事務(wù)?  回復(fù)  更多評(píng)論
      
    # re: Spring多數(shù)據(jù)源解決方案 2009-07-29 15:44 | lordz
    如果是MySQL+Oracle,sql-map-config.xml是不一樣的 那怎么配置呢?  回復(fù)  更多評(píng)論
      
    # re: Spring多數(shù)據(jù)源解決方案 [未登錄] 2009-12-01 13:23 | 懶貓
    如果各個(gè)dataSource上的數(shù)據(jù)庫(kù)結(jié)構(gòu)不一樣的話,這個(gè)方法是不能解決問(wèn)題的  回復(fù)  更多評(píng)論
      
    主站蜘蛛池模板: 一级做a爰黑人又硬又粗免费看51社区国产精品视 | 亚洲伊人久久大香线蕉在观| 亚洲午夜激情视频| 白白国产永久免费视频| 免费福利视频导航| 久爱免费观看在线网站| 久久九九久精品国产免费直播| 亚洲欧美成人av在线观看| 亚洲精品日韩中文字幕久久久| 国产综合亚洲专区在线| 国产免费av一区二区三区| 最新中文字幕免费视频| 18成禁人视频免费网站| 日本卡1卡2卡三卡免费| 久久高潮一级毛片免费| 色哟哟国产精品免费观看| 亚洲人成自拍网站在线观看| 亚洲丝袜中文字幕| 亚洲精品视频在线播放| 亚洲国产综合专区在线电影| 亚洲乱色熟女一区二区三区丝袜| 亚洲精品偷拍视频免费观看| 国产成人无码区免费A∨视频网站| 久久精品无码一区二区三区免费| 免费观看美女用震蛋喷水的视频| 久久综合国产乱子伦精品免费| 中文字幕日本人妻久久久免费| 99精品视频在线观看免费| 一区免费在线观看| 一级特级aaaa毛片免费观看| 九九久久国产精品免费热6| 永久免费观看黄网站| www.xxxx.com日本免费| 成在线人视频免费视频| 久久久久久久久久免免费精品| 黄色短视频免费看| 日本一区午夜艳熟免费| 国产99视频精品免费专区| 国产精品免费看久久久| 91大神在线免费观看| 97免费人妻无码视频|