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

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

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

    vjame

    優(yōu)化代碼是無止境的
    隨筆 - 65, 文章 - 9, 評論 - 26, 引用 - 0
    數(shù)據(jù)加載中……

    關于Hibernate懶加載問題的最終解決方案

    轉載http://tuoxie007.javaeye.com/blog/334853

    Hibernate的強大之處之一是懶加載功能,可以有效的降低數(shù)據(jù)庫訪問次數(shù)和內存使用量。但用的不好就會出現(xiàn)org.hibernate.LazyInitializationException。

    這個異常出現(xiàn)的原因很簡單,主要時在加載懶數(shù)據(jù)時Session已經關閉造成的,

    那么OK,我們來考慮怎么解決吧。

    我們只要在渲染JSP之前不要關閉Session,而在JSP渲染之后再關閉就OK啊。我們知道,在JSP/Servlet中,可以配置過濾器來實現(xiàn)這種功能。

     

    我們考慮兩種情況的解決方案: 單使用Hibernate和用Spring來管理Hibernate。

     

    1. 單使用Hibernate:

    我們可以自己寫一個過濾器:

    Java代碼
    1. import java.io.IOException;   
    2.   
    3. import javax.servlet.Filter;   
    4. import javax.servlet.FilterChain;   
    5. import javax.servlet.FilterConfig;   
    6. import javax.servlet.ServletException;   
    7. import javax.servlet.ServletRequest;   
    8. import javax.servlet.ServletResponse;   
    9.   
    10. import org.hibernate.SessionFactory;   
    11. import org.hibernate.StaleObjectStateException;   
    12. import org.sunxin.struts2.util.hibernate.HibernateUtil;   
    13.   
    14.   
    15. public class HibernateThreadFilter implements Filter   
    16. {   
    17.     private SessionFactory sf=null;   
    18.        
    19.     public void init(FilterConfig arg0) throws ServletException   
    20.     {   
    21.            
    22.         sf=HibernateUtil.getSessionFactory();   
    23.     }   
    24.   
    25.     public void doFilter(ServletRequest request, ServletResponse response,   
    26.             FilterChain chain) throws IOException, ServletException   
    27.     {   
    28.         try  
    29.         {   
    30.                
    31.             sf.getCurrentSession().beginTransaction();   
    32.                
    33.             chain.doFilter(request, response);   
    34.                
    35.             sf.getCurrentSession().getTransaction().commit();   
    36.                
    37.         }   
    38.         catch (StaleObjectStateException staleEx)   
    39.         {   
    40.             throw staleEx;   
    41.         }   
    42.         catch (Throwable ex)   
    43.         {   
    44.             ex.printStackTrace();   
    45.             try  
    46.             {   
    47.             //如果發(fā)生異常,讓事務回滾。   
    48.                 if (sf.getCurrentSession().getTransaction().isActive())   
    49.                 {   
    50.                     sf.getCurrentSession().getTransaction().rollback();   
    51.                 }   
    52.             }    
    53.             catch (Throwable rbEx)   
    54.             {   
    55.                System.err.println(rbEx.toString());   
    56.             }   
    57.         }   
    58.     }   
    59.   
    60.     public void destroy(){}   
    61.   
    62. }  

     

    在web.xml中加入這個Filter的配置:

    Xml代碼
    1. <filter>  
    2.     <filter-name>HibernateThreadFilter</filter-name>  
    3.     <filter-class>org.sunxin.struts2.filter.HibernateThreadFilter</filter-class>  
    4. </filter>  
    5. <filter-mapping>  
    6.     <filter-name>HibernateThreadFilter</filter-name>  
    7.     <url-pattern>/*</url-pattern>  
    8. </filter-mapping>  

     這樣就在訪問后臺代碼之前打開session,訪問后臺代碼之后關閉session。

     

    2. 用Spring管理Hibernate:

    I . Spring為我們提供了這樣一個過濾器,我們這樣配置一下就OK。

    在web.xml中加入Filter的配置:

    Xml代碼
    1. <filter>  
    2.     <description>處理Hibernate的懶加載問題</description>  
    3.     <filter-name>openSessionInViewFilter</filter-name>  
    4.     <filter-class>  
    5.         org.springframework.orm.hibernate3.support.OpenSessionInViewFilter   
    6.     </filter-class>  
    7.     <init-param>  
    8.         <description>  
    9.             默認情況下,這個Filter會在Spring的bean池中找一個叫做sessionFactory的bean。如果使用了其他名字的SessionFactory,則應該在這里   
    10.             指定這個名字。   
    11.         </description>  
    12.         <param-name>sessionFactoryBeanName</param-name>  
    13.         <param-value>sessionFactory</param-value>  
    14.     </init-param>  
    15.     <init-param>  
    16.         <description></description>  
    17.         <param-name>singleSession</param-name>  
    18.         <param-value>true</param-value>  
    19.     </init-param>  
    20. </filter>  

    posted on 2009-07-30 10:09 lanjh 閱讀(1327) 評論(0)  編輯  收藏 所屬分類: Java Web

    主站蜘蛛池模板: 成人au免费视频影院| 成年黄网站色大免费全看| 成人福利在线观看免费视频| 亚洲欧美国产精品专区久久| 美女隐私免费视频看| 国产在线国偷精品免费看| 18女人水真多免费高清毛片| 成人毛片18女人毛片免费视频未| 亚洲一级Av无码毛片久久精品 | 99精品视频免费在线观看| 日韩国产免费一区二区三区| 精品国产人成亚洲区| 亚洲AV综合色区无码二区偷拍| 羞羞视频免费观看| 亚洲成人国产精品| 亚洲色图激情文学| 中国videos性高清免费| 国产AV无码专区亚洲A∨毛片| 亚洲色欲色欲www在线播放| 久久免费视频99| 亚洲国产精品一区二区三区久久| 一级人做人a爰免费视频| 夜夜嘿视频免费看| 免费看国产成年无码AV片| 亚洲色偷偷综合亚洲AV伊人| 黄色视屏在线免费播放| 免费一级黄色毛片| 亚洲日韩国产精品乱-久| 免费播放特黄特色毛片| 永久免费av无码入口国语片| 亚洲成?v人片天堂网无码| 97超高清在线观看免费视频| 中文亚洲成a人片在线观看| 热久久这里是精品6免费观看| 日本久久久久亚洲中字幕| eeuss影院www天堂免费| 亚洲国产91精品无码专区| 亚洲免费视频网站| 亚洲国产综合无码一区| aa级毛片毛片免费观看久| 亚洲成人福利在线|