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

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

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

    空間站

    北極心空

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

    問題的分析

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

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

    (二)            設計MultiDataSource類

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

    對比原Decorator

  •     private DataSource dataSource = null;   
  • public MultiDataSource(DataSource dataSource){   
  •         this.dataSource = dataSource;   
  •     }   
  •     /* (non-Javadoc)  
  •      * @see javax.sql.DataSource#getConnection()  
  •      */  
  •     public Connection getConnection() throws SQLException {   
  •         return getDataSource().getConnection();   
  •     }   
  •     //其它DataSource接口應當實現的方法   
  •   
  •     public DataSource getDataSource(){   
  •         return this.dataSource;   
  •         }   
  •     }   
  •     public void setDataSource(DataSource dataSource) {   
  •         this.dataSource = dataSource;   
  •     }   
  • }   
    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()在整個這個方案中,我們需要實現的只有MultiSessionFactory。MultiSessionFactoryclass 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 蘆葦 閱讀(5400) 評論(1)  編輯  收藏 所屬分類: JAVA

                    Feedback

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

                    主站蜘蛛池模板: 中文字幕av无码不卡免费| 福利免费观看午夜体检区| 亚洲国产精品久久久久婷婷老年| 国产免费不卡视频| 亚洲av永久中文无码精品 | 国产gv天堂亚洲国产gv刚刚碰| 午夜爽爽爽男女免费观看影院| 亚洲日韩精品无码AV海量| 久久久精品国产亚洲成人满18免费网站| 国产色无码精品视频免费| 亚洲一区在线观看视频| 国产亚洲精品a在线观看| 亚洲免费福利在线视频| 一区二区免费在线观看| 亚洲一欧洲中文字幕在线| AV在线亚洲男人的天堂| 成年人视频在线观看免费| 丁香花在线观看免费观看图片| 中文字幕在线观看亚洲视频| 国产偷国产偷亚洲高清日韩| 成人免费一级毛片在线播放视频 | 亚洲黄色免费电影| 四虎影视久久久免费观看| 亚洲国产片在线观看| 国产日韩成人亚洲丁香婷婷| 免费理论片51人人看电影| 一级毛片免费观看不卡视频| 美女黄频a美女大全免费皮| 91亚洲精品麻豆| 亚洲精品国偷自产在线| 内射无码专区久久亚洲| 成年美女黄网站18禁免费| 一区二区三区四区免费视频 | 久久久久精品国产亚洲AV无码| 亚洲精品国精品久久99热一| 少妇亚洲免费精品| 免费看美女让人桶尿口| 一级女人18毛片免费| 99视频在线精品免费| 国产A∨免费精品视频| 精品亚洲国产成人av|