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

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

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

    vjame

    優化代碼是無止境的
    隨筆 - 65, 文章 - 9, 評論 - 26, 引用 - 0
    數據加載中……

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

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

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

    這個異常出現的原因很簡單,主要時在加載懶數據時Session已經關閉造成的,

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

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

     

    我們考慮兩種情況的解決方案: 單使用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.             //如果發生異常,讓事務回滾。   
    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

    主站蜘蛛池模板: 国产色爽免费视频| 午夜无遮挡羞羞漫画免费| 国产亚洲精久久久久久无码AV| 亚洲人AV在线无码影院观看| 一二三四在线观看免费高清中文在线观看| 亚洲AV无码国产精品色午友在线 | 久久成人18免费网站| 免费二级毛片免费完整视频| 男女超爽视频免费播放| 亚洲av手机在线观看| 日韩大片在线永久免费观看网站 | 亚洲精品视频在线免费| 99久久免费国产香蕉麻豆| 亚洲午夜在线播放| 日本不卡高清中文字幕免费| 激情吃奶吻胸免费视频xxxx| 久久久久国产亚洲AV麻豆| 中文精品人人永久免费| 无码乱人伦一区二区亚洲| h片在线免费观看| 亚洲精品无码久久久久久| 免费看一级做a爰片久久| jizz18免费视频| 亚洲国产精品高清久久久| 在线免费中文字幕| 亚洲日韩亚洲另类激情文学| 高清在线亚洲精品国产二区| 91在线免费视频| avtt天堂网手机版亚洲| 免费夜色污私人影院在线观看| 成在线人视频免费视频| 亚洲日韩乱码中文无码蜜桃| 日本免费人成黄页网观看视频| 中文字幕的电影免费网站| 亚洲神级电影国语版| 又粗又大又长又爽免费视频| 国产麻豆成人传媒免费观看 | 亚洲日韩国产精品第一页一区| 日韩精品无码专区免费播放| 亚洲欧美日韩一区二区三区 | ZZIJZZIJ亚洲日本少妇JIZJIZ|