zyskm用夢想丈量人生,用奔跑丈量激情

          基于spring的動(dòng)態(tài)數(shù)據(jù)源

          基于spring的動(dòng)態(tài)數(shù)據(jù)源
          項(xiàng)目過程中遇到這樣一個(gè)需求,系統(tǒng)啟動(dòng)后動(dòng)態(tài)設(shè)置數(shù)據(jù)源,不同用戶登錄系統(tǒng)后訪問的數(shù)據(jù)庫不同。
          好在所有書庫結(jié)構(gòu)一致。
          用spring 的AbstractRoutingDataSource解決了這個(gè)問題。
          原理如圖:

          項(xiàng)目采用的是hibernate,直接在spring.xml設(shè)置sessionFactory的dataSource屬性為動(dòng)態(tài)數(shù)據(jù)源即可。
          因?yàn)轫?xiàng)目所有數(shù)據(jù)庫結(jié)構(gòu)都一致,為了避免每次設(shè)置數(shù)據(jù)源的時(shí)候要改一堆參數(shù),修改了spring AbstractRoutingDataSource類增加了一個(gè)getTargetDataSources方法,獲取當(dāng)前數(shù)據(jù)源詳細(xì)信息,在其基礎(chǔ)上修改數(shù)據(jù)庫名稱、用戶名、密碼即可,不用每次設(shè)置一堆參數(shù)。
          Map<String,ComboPooledDataSource> targetDataSources=dynamicDataSource.getTargetDataSources();
                          
          if(targetDataSources==null){
                              targetDataSources
          =new HashMap<String, ComboPooledDataSource>();
                              targetDataSources.put(
          "baseDataSource", baseDataSource);
                          }

                          targetDataSources.put(dataSourceName, subSystemDataSource);
                          dynamicDataSource.setTargetDataSources(targetDataSources);
                          dynamicDataSource.afterPropertiesSet();
          另外,設(shè)置AbstractRoutingDataSource參數(shù)后要調(diào)用afterPropertiesSet()方法,spring容器才會(huì)進(jìn)行加載操作。

          在動(dòng)態(tài)設(shè)置數(shù)據(jù)源方面,可以通過兩種方式實(shí)現(xiàn):
          1.在action(項(xiàng)目使用struts)中進(jìn)行設(shè)置,可以確保在每個(gè)servlet線程中數(shù)據(jù)源是一致的。
          2.以aop方式,對service方法進(jìn)行攔截,根據(jù)需求設(shè)置不同數(shù)據(jù)源。

          posted on 2011-10-24 17:11 zyskm 閱讀(3586) 評論(2)  編輯  收藏

          評論

          # re: 基于spring的動(dòng)態(tài)數(shù)據(jù)源 2011-10-25 08:22 tbw

          很好的想法   回復(fù)  更多評論   

          # re: 基于spring的動(dòng)態(tài)數(shù)據(jù)源 2012-09-07 15:31 wys

          方案非常不錯(cuò),不知道能不能把相關(guān)代碼共享一下,目前也遇到類似的需求希望能夠幫助解決一下,謝謝了,Q郵箱:471372495@qq.com  回復(fù)  更多評論   


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 榆中县| 卢湾区| 岳池县| 靖安县| 望江县| 威远县| 常熟市| 大同县| 定安县| 沛县| 新化县| 商都县| 贡觉县| 顺义区| 海阳市| 黄冈市| 浑源县| 伊金霍洛旗| 新宁县| 胶南市| 武强县| 元朗区| 汉阴县| 白玉县| 金门县| 高清| 齐河县| 洛宁县| 清原| 太康县| 杂多县| 修水县| 拜城县| 长葛市| 阿巴嘎旗| 浑源县| 句容市| 开平市| 泽库县| 平陆县| 泰来县|