vjame

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

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

          轉(zhuǎn)載http://tuoxie007.javaeye.com/blog/334853

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

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

          那么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 閱讀(1328) 評論(0)  編輯  收藏 所屬分類: Java Web

          主站蜘蛛池模板: 甘孜| 汝城县| 冀州市| 绥江县| 九龙坡区| 皋兰县| 五峰| 上思县| 安溪县| 临桂县| 巫山县| 昆明市| 南溪县| 应城市| 茂名市| 济阳县| 巫溪县| 阿拉善左旗| 柏乡县| 营山县| 宿迁市| 西乡县| 潼关县| 广西| 鄂伦春自治旗| 定安县| 新晃| 崇明县| 蒲城县| 曲周县| 余姚市| 新乡市| 镇沅| 大竹县| 偃师市| 陆河县| 常德市| 盐边县| 桂东县| 三河市| 铁岭市|