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

          基于spring的動態數據源

          基于spring的動態數據源
          項目過程中遇到這樣一個需求,系統啟動后動態設置數據源,不同用戶登錄系統后訪問的數據庫不同。
          好在所有書庫結構一致。
          用spring 的AbstractRoutingDataSource解決了這個問題。
          原理如圖:

          項目采用的是hibernate,直接在spring.xml設置sessionFactory的dataSource屬性為動態數據源即可。
          因為項目所有數據庫結構都一致,為了避免每次設置數據源的時候要改一堆參數,修改了spring AbstractRoutingDataSource類增加了一個getTargetDataSources方法,獲取當前數據源詳細信息,在其基礎上修改數據庫名稱、用戶名、密碼即可,不用每次設置一堆參數。
          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();
          另外,設置AbstractRoutingDataSource參數后要調用afterPropertiesSet()方法,spring容器才會進行加載操作。

          在動態設置數據源方面,可以通過兩種方式實現:
          1.在action(項目使用struts)中進行設置,可以確保在每個servlet線程中數據源是一致的。
          2.以aop方式,對service方法進行攔截,根據需求設置不同數據源。

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

          評論

          # re: 基于spring的動態數據源 2011-10-25 08:22 tbw

          很好的想法   回復  更多評論   

          # re: 基于spring的動態數據源 2012-09-07 15:31 wys

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


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


          網站導航:
           
          主站蜘蛛池模板: 河东区| 澜沧| 乌兰察布市| 东城区| 临沧市| 五大连池市| 石河子市| 应用必备| 大名县| 深州市| 彩票| 滨州市| 宜黄县| 乐业县| 樟树市| 马边| 保康县| 尚志市| 万山特区| 拉孜县| 康保县| 和龙市| 闸北区| 嵊州市| 彭阳县| 泸溪县| 潮安县| 杨浦区| 西和县| 泉州市| 安徽省| 镇坪县| 繁昌县| 江北区| 霍州市| 日照市| 株洲县| 新龙县| 板桥市| 历史| 山东|