空間站

          北極心空

            BlogJava :: 首頁 :: 聯系 :: 聚合  :: 管理
            15 Posts :: 393 Stories :: 160 Comments :: 0 Trackbacks

          問題的分析

          我首先想到在spring但是,我很快發現一個問題:當多用戶同時并發訪問數據庫的時候會出現資源爭用的問題。這都是“單例模式”惹的禍。眾所周知,我們在使用spring通過以上的分析,解決多數據源訪問問題的關鍵,就集中在sessionFactory(一)            采用Decorator設計模式

          要解決這個問題,我的思路鎖定在了這個dataSource什么是“

          (二)            設計MultiDataSource類

          現在回到我們的問題,我們需要對dataSource

          對比原Decorator

        1.     private DataSource dataSource = null;   
        2. public MultiDataSource(DataSource dataSource){   
        3.         this.dataSource = dataSource;   
        4.     }   
        5.     /* (non-Javadoc)  
        6.      * @see javax.sql.DataSource#getConnection()  
        7.      */  
        8.     public Connection getConnection() throws SQLException {   
        9.         return getDataSource().getConnection();   
        10.     }   
        11.     //其它DataSource接口應當實現的方法   
        12.   
        13.     public DataSource getDataSource(){   
        14.         return this.dataSource;   
        15.         }   
        16.     }   
        17.     public void setDataSource(DataSource dataSource) {   
        18.         this.dataSource = dataSource;   
        19.     }   
        20. }   
          1. 客戶在發出請求的時候,將dataSourceName放到request中,然后把request中的數據源名通過調用new MultiDataSource(dataSource)時可以告訴客戶需要的數據源,就可以實現動態切換數據源了。但細心的朋友會發現這在單例的情況下就是問題的,因為在系統中只有一個對象,它的實例變量也只有一個,就如同一個靜態變量一般。正因為如此,(三)            單例模式下的MultiDataSource

            在單例模式下,由于我們在每次調用MultiDataSource

          2.         log.debug("dataSourceName:"+dataSourceName);   
          3.         try{   
          4.             if(dataSourceName==null||dataSourceName.equals("")){   
          5.                 return this.dataSource;   
          6.             }   
          7.             return (DataSource)this.applicationContext.getBean(dataSourceName);   
          8.         }catch(NoSuchBeanDefinitionException ex){   
          9.             throw new DaoException("There is not the dataSource 
          10.         }   
          11.     }   
            1. 值得一提的是,我需要的數據源已經都在spring就是其對應的bean id="dataSource1"  

            2.     class="org.apache.commons.dbcp.BasicDataSource">  
            3.     <property name="driverClassName">  
            4.         <value>oracle.jdbc.driver.OracleDrivervalue>  
            5.     property> 
            6.     ......   
            7. bean>  
            8. <bean id="dataSource2"  
            9.     class="org.apache.commons.dbcp.BasicDataSource">  
            10.     <property name="driverClassName">  
            11.         <value>oracle.jdbc.driver.OracleDrivervalue> 
            12.     property>   
            13.     ......   
            14. bean>   
              1. 為了得到spring,并且實現方法:

                java 代碼
                1. private ApplicationContext applicationContext = null;   
                2. public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {   
                3.         this.applicationContext = applicationContext;   
                4.     }   

                如此這樣,我就可以通過得到了。

                (四)            通過線程傳遞dataSourceName

                查看以上設計,MultiDataSource

                class SpObserver {   
              2.     private static ThreadLocal local = new ThreadLocal();   
              3.     public static void putSp(String sp) {   
              4.         local.set(sp);   
              5.     }   
              6.     public static String getSp() {   
              7.         return (String)local.get();   
              8.     }   
              9. }   
                1. 做一個filter,將request中的dataSourceName對象。

                2.         String sp = SpObserver.getSp();   
                3.         return getDataSource(sp);   
                4.     }   
                  1. 完整的MultiDataSource(五)            動態添加數據源

                    通過以上方案,我們解決了動態分配數據源的問題,但你可能提出疑問:方案中的數據源都是配置在spring中(見附件)。不通過配置文件直接加載對象,在的源碼中也有,感興趣的朋友可以自己研究。

                    (六)            在spring中配置

                    在完成了所有這些設計以后,我最后再嘮叨一句。我們應當在springbean id="dynamicLoadBean" class="com.htxx.service.dao.DynamicLoadBean">bean>  

                  2. <bean id="dataSource" class="com.htxx.service.dao.MultiDataSource">  
                  3.         <property name="dataSource">  
                  4.             <ref bean="dataSource1" />  
                  5.         property>  
                  6.     bean>  
                  7.     <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">  
                  8.         <property name="dataSource">  
                  9.             <ref bean="dataSource" />  
                  10.         property>  
                  11.         ......   
                  12.     bean>  
                    1. 其中dataSource以上方案與其它方案相比,它有哪些優勢呢?

                      首先,這個方案完全是在spring其次,實現簡單,易于維護。這個方案雖然我說了這么多東西,其實都是分析,真正需要我們寫的代碼就只有MultiDataSource最后,這個方案可以使單數據源與多數據源兼容。這個方案完全不影響BUS相關博客:再析在spring框架中解決多數據源的問題

                      example.rar
                       描述:  源碼及示例
                      下載
                       文件名:  example.rar
                       文件大小:  32 KB
                       下載過的:  文件被下載或查看 521 次

                      關鍵字: Spring   Hibernate Decorator 設計模式    
                      如何在spring總結多數據源的問題,其實它需要分為以下三種情況:各個數據源的數據結構不同、各個數據源的數據結構相同、各個數據源的數據結構部分相同又有部分不同。對于第二種情況,各個數據源的數據結構相同,我們使用一個sessionFactory對于各個數據源的數據結構不同的情況,使用一個sessionFactoryMultiDataSource

                       

                      在該方案中,SessionFactory接口,Decorator就是MultiSessionFactorySessionFactory1SessionFactory2往往是spring。細心的朋友可能會注意,實際上并不是SessionFactory的時候其實并不是真正地得到了它,而是得到了一個SessionFactory重寫了getObject()在整個這個方案中,我們需要實現的只有MultiSessionFactoryMultiSessionFactoryclass MultiSessionFactory implements SessionFactory, ApplicationContextAware {   

                    2.     private static final long serialVersionUID = 2064557324203496378L;   
                    3.     private static final Log log = LogFactory.getLog(MultiSessionFactory.class);   
                    4.     private ApplicationContext applicationContext = null;   
                    5.     private SessionFactory sessionFactory = null;   
                    6.     public ApplicationContext getApplicationContext() {   
                    7.         return applicationContext;   
                    8.     }   
                    9.     public void setApplicationContext(ApplicationContext applicationContext) {   
                    10.        this.applicationContext = applicationContext;   
                    11.     }   
                    12.     public SessionFactory getSessionFactory(String sessionFactoryName) {   
                    13.        log.debug("sessionFactoryName:"+sessionFactoryName);   
                    14.        try{   
                    15.            if(sessionFactoryName==null||sessionFactoryName.equals("")){   
                    16.               return sessionFactory;   
                    17.            }   
                    18.            return (SessionFactory)this.getApplicationContext().getBean(sessionFactoryName);   
                    19.        }catch(NoSuchBeanDefinitionException ex){   
                    20.            throw new DaoException("There is not the sessionFactory 
                    21.        }   
                    22.     }   
                    23.   
                    24.     public SessionFactory getSessionFactory() {   
                    25.        String sessionFactoryName = SpObserver.getSp();   
                    26.        return getSessionFactory(sessionFactoryName);   
                    27.     }   
                    28.   
                    29.     public void setSessionFactory(SessionFactory sessionFactory) {   
                    30.        this.sessionFactory = sessionFactory;   
                    31.     }   
                    32.   
                    33.     // SessionFactory接口需要實現的方法   
                    34.   
                    35. ......   
                    36.   
                    37. }  
                      1. MultiSessionFactory的完整代碼見我提供的附件。bean id="sessionFactory" class="com.htxx.service.dao.MultiSessionFactory">  

                      2.     <property name="sessionFactory"><ref bean="hostSessionFactory"/>property> 
                      3. >  
                        1. SpServer的寫法與《如何在另外,在spring也許有些朋友對以上方案還不滿意,因為在執行數據訪問前畢竟還要多做一步指定sessionFactory另外,在這個方案中的核心是運用Decorator前面我已經給出了第一種和第二種情況的解決方案:各個數據源的數據結構不同的情況用MultiSessionFactory
                          example.rar
                           描述:  示例文件
                          下載
                           文件名:  example.rar
                           文件大小:  16 KB
                           下載過的:  文件被下載或查看 180 次

                          建議到原作者博客查看原文,那里有很好的回復討論~http://fangang.javaeye.com/blog/72486
                          posted on 2007-10-15 09:53 蘆葦 閱讀(5405) 評論(1)  編輯  收藏 所屬分類: JAVA

                          Feedback

                          # re: 如何在spring框架中解決多數據源的問題 2014-04-10 16:02 最代碼
                          我整理到了最代碼網站上了,有問題請回復,地址:
                          http://www.zuidaima.com/share/1774074130205696.htm  回復  更多評論
                            

                          主站蜘蛛池模板: 龙泉市| 滦平县| 肇州县| 瑞金市| 固阳县| 万宁市| 新田县| 贡嘎县| 南康市| 峡江县| 阳朔县| 绥芬河市| 南召县| 盐津县| 田东县| 观塘区| 元阳县| 崇信县| 富源县| 宜城市| 吉林省| 辉南县| 呈贡县| 靖江市| 祥云县| 吉安市| 霍林郭勒市| 宁城县| 岐山县| 阿鲁科尔沁旗| 花莲市| 嘉祥县| 南和县| 宁波市| 安顺市| 金沙县| 特克斯县| 沧州市| 卓资县| 梅河口市| 霍邱县|