zyskm用夢(mèng)想丈量人生,用奔跑丈量激情

          導(dǎo)航

          <2011年10月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          統(tǒng)計(jì)

          公告

          zyskm,zys是鄭勇勝的拼音簡(jiǎn)寫,km公里的意思。
          以前曾跑過一段時(shí)間馬拉松,知道了這句名言“用夢(mèng)想丈量人生,用奔跑丈量激情”,丈量的單位用公里km。

          常用鏈接

          留言簿(1)

          隨筆檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          基于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方式,對(duì)service方法進(jìn)行攔截,根據(jù)需求設(shè)置不同數(shù)據(jù)源。

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

          評(píng)論

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

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

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

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


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


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 鲁甸县| 额济纳旗| 辽阳县| 萨迦县| 桂平市| 大悟县| 社会| 武平县| 巴塘县| 华坪县| 和龙市| 浦北县| 桐梓县| 阿坝县| 甘孜县| 巴东县| 广州市| 高安市| 揭西县| 越西县| 苍南县| 宽城| 镇安县| 广东省| 巴林左旗| 财经| 德化县| 堆龙德庆县| 遂宁市| 乾安县| 祥云县| 玉田县| 郴州市| 梁河县| 平陆县| 漳浦县| 宜昌市| 太康县| 越西县| 武鸣县| 齐河县|