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

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

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

    J2EE之巔

     

    Spring多數(shù)據(jù)源解決方案

     

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

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

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


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

    解決方案


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

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

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

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

    實例:

    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來決定數(shù)據(jù)存放在哪個數(shù)據(jù)庫中。

    配置文件示例:

    <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 超越巔峰 閱讀(5156) 評論(10)  編輯  收藏

    評論

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

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

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

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

    # re: Spring多數(shù)據(jù)源解決方案 2009-07-05 23:53 subtitle

    不錯  回復  更多評論   

    # re: Spring多數(shù)據(jù)源解決方案 2009-07-06 01:12 MyYate

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

    # re: Spring多數(shù)據(jù)源解決方案 2009-07-06 10:16 awed

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

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

    不錯
    1  回復  更多評論   

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

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

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

    轉(zhuǎn)載 還打上自己名字..........歷害  回復  更多評論   

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

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

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

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


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


    網(wǎng)站導航:
    博客園   IT新聞   Chat2DB   C++博客   博問  
     

    導航

    統(tǒng)計

    常用鏈接

    留言簿(12)

    隨筆分類(54)

    隨筆檔案(59)

    文章分類(2)

    文章檔案(1)

    相冊

    搜索

    積分與排名

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲中文字幕无码一区二区三区| 亚洲av永久无码精品网站| 一级中文字幕乱码免费| 亚洲AV乱码久久精品蜜桃 | 99精品全国免费观看视频| 爱爱帝国亚洲一区二区三区| 亚洲色大成网站WWW久久九九| 国产大片免费网站不卡美女| 美女视频黄a视频全免费网站色| 亚洲AV无码不卡无码| 久久久久久久久免费看无码| 一级做a爱过程免费视频高清| 亚洲精品一区二区三区四区乱码| 国产精品无码素人福利免费| 中文字幕在线观看免费视频| 免费大片av手机看片| 亚洲成a人片在线网站| 久久精品国产精品亚洲人人| 无码乱肉视频免费大全合集| 国产高清对白在线观看免费91| 亚洲av无码久久忘忧草| 亚洲精品国产精品乱码在线观看 | 亚洲四虎永久在线播放| 免费在线看片网站| 无码国产精品一区二区免费| 中国精品一级毛片免费播放| 毛片亚洲AV无码精品国产午夜| 亚洲成年人免费网站| 亚洲国产另类久久久精品小说| 国产免费看插插插视频| 成人AV免费网址在线观看| a毛看片免费观看视频| 污网站在线观看免费| 亚洲码欧美码一区二区三区| 亚洲卡一卡2卡三卡4卡无卡三| 亚洲欧洲精品成人久久奇米网| 在线免费观看毛片网站| 91手机看片国产永久免费| 久久久久久影院久久久久免费精品国产小说| 国产亚洲视频在线观看网址| 亚洲中文字幕久久久一区|