欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談解決Hibernate懶加載的4種方式

 更新時間:2017年12月22日 11:12:49   作者:最美的詞  
這篇文章主要介紹了淺談解決Hibernate懶加載的4種方式,具有一定借鑒價值,需要的朋友可以參考下。

本文總結(jié)了我在學(xué)習(xí)hibernate的過程中,解決hibernate懶加載問題的四種方式。

所謂懶加載(lazy)就是延時加載,延遲加載。

什么時候用懶加載呢,我只能回答要用懶加載的時候就用懶加載。

至于為什么要用懶加載呢,就是當(dāng)我們要訪問的數(shù)據(jù)量過大時,明顯用緩存不太合適,因?yàn)閮?nèi)存容量有限,為了減少并發(fā)量,減少系統(tǒng)資源的消耗,我們讓數(shù)據(jù)在需要的時候才進(jìn)行加載,這時我們就用到了懶加載。

例如,有一個對象是Employee,還有一個對象是Department。顯然,對于Employee相對Department來說,是多對一的關(guān)系;而對于Department相對Employee來說,是一對多的關(guān)系。當(dāng)我們查詢Employee對象的時候,如果希望通過employee對象的屬性department查詢到所對應(yīng)的Department,那么是會拋出異常的。這是因?yàn)閼屑虞d的存在,在session關(guān)閉之后,hibernate又向數(shù)據(jù)庫發(fā)出一次請求,結(jié)果就拋出異常了。

下面總結(jié)的是解決這個問題的四種方式:

1.顯式初始化(在查詢方法內(nèi)部)

要查詢某員工屬于哪個部門的時候,需要對Department進(jìn)行預(yù)先查詢

使用語句

Hibernate.initialize(Department.class); 

2.修改對象關(guān)系文件,將lazy改寫lazy=false,即關(guān)閉懶加載

以上兩種方法,確實(shí)可以解決問題,但是缺點(diǎn)是無論后面是否使用該對象,hibernate都會向數(shù)據(jù)庫發(fā)出SQL語句請求數(shù)據(jù),造成不必要的性能浪費(fèi)。

3.使用過濾器(web項目)

①獲取session的方式必須使用getCurrentSession

②特殊的關(guān)閉session方式

public void doFilter(ServletRequest request, ServletResponse response, 
   FilterChain arg2) throws IOException, ServletException { 
  // TODO Auto-generated method stub 
  Session session = null; 
  Transaction tx = null; 
  try { 
   session = HibernateUtil.getCurrentSession(); 
   tx = session.beginTransaction(); 
   arg2.doFilter(request, response);//請求一直在走 
   tx.commit(); 
  } catch (Exception e) { 
   // TODO: handle exception 
   if(tx != null){ 
    tx.rollback(); 
   } 
  }finally{ 
   //特殊的關(guān)閉方式 
   HibernateUtil.closeCurrentSession(); 
  } 
 } 

4.在SSH框架中,使用spring提供的openSessionView

其原理和第三種方法中使用Filter類似,只不過這個filter是spring提供的。使用時只需要在web.xml文件配置如下:

<!-- 使用spring解決懶加載問題 --> 
 <filter> 
  <filter-name>OpenSessionInViewFilter</filter-name> 
  <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class> 
 </filter> 
 <filter-mapping> 
  <filter-name>OpenSessionInViewFilter</filter-name> 
  <url-pattern>/*</url-pattern> 
 </filter-mapping> 

第3和第4中方法也能解決懶加載的問題,其中第4種方法也是目前使用較多的。但是這兩種方法也是有缺點(diǎn)的,缺點(diǎn)就是延長了session關(guān)閉的時間,session的生命周期變長。沒有使用該方法之前,session是在查詢完數(shù)據(jù)之后,就被關(guān)閉了;而現(xiàn)在,session的關(guān)閉是在一次web請求的最后才關(guān)閉。

總結(jié)

以上就是本文關(guān)于淺談解決Hibernate懶加載的4種方式的全部內(nèi)容,希望對大家有所幫助。感興趣的朋友可以繼續(xù)參閱本站其他相關(guān)專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!

相關(guān)文章

  • MyBatis實(shí)現(xiàn)SQL映射文件

    MyBatis實(shí)現(xiàn)SQL映射文件

    映射器是 MyBatis 中最復(fù)雜并且是最重要的組件,本文主要介紹了MyBatis實(shí)現(xiàn)SQL映射文件,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-06-06
  • MyBatis中防止SQL注入講解

    MyBatis中防止SQL注入講解

    這篇文章主要介紹了MyBatis中防止SQL注入,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2021-12-12
  • Mybatis Plus 實(shí)現(xiàn)批量插入的示例代碼

    Mybatis Plus 實(shí)現(xiàn)批量插入的示例代碼

    本文主要介紹了Mybatis Plus 實(shí)現(xiàn)批量插入的示例代碼,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • 解決kafka消息堆積及分區(qū)不均勻的問題

    解決kafka消息堆積及分區(qū)不均勻的問題

    這篇文章主要介紹了解決kafka消息堆積及分區(qū)不均勻的問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-09-09
  • 攜程Apollo(阿波羅)安裝部署以及java整合實(shí)現(xiàn)

    攜程Apollo(阿波羅)安裝部署以及java整合實(shí)現(xiàn)

    這篇文章主要介紹了攜程Apollo(阿波羅)安裝部署以及java整合實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • 關(guān)于springboot使用rocketmq?RocketMQMessageListener參數(shù)問題

    關(guān)于springboot使用rocketmq?RocketMQMessageListener參數(shù)問題

    這篇文章主要介紹了springboot使用rocketmq?RocketMQMessageListener參數(shù)問題,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值需要的朋友可以參考下
    2022-11-11
  • 基于selenium-java封裝chrome、firefox、phantomjs實(shí)現(xiàn)爬蟲

    基于selenium-java封裝chrome、firefox、phantomjs實(shí)現(xiàn)爬蟲

    這篇文章主要介紹了基于selenium-java封裝chrome、firefox、phantomjs實(shí)現(xiàn)爬蟲,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2020-10-10
  • 歸并排序時間復(fù)雜度過程推導(dǎo)詳解

    歸并排序時間復(fù)雜度過程推導(dǎo)詳解

    這篇文章主要介紹了C語言實(shí)現(xiàn)排序算法之歸并排序,對歸并排序的原理及實(shí)現(xiàn)過程做了非常詳細(xì)的解讀,需要的朋友可以參考下,希望能幫助到你
    2021-08-08
  • Springboot如何使用mybatis實(shí)現(xiàn)攔截SQL分頁

    Springboot如何使用mybatis實(shí)現(xiàn)攔截SQL分頁

    這篇文章主要介紹了Springboot使用mybatis實(shí)現(xiàn)攔截SQL分頁,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-06-06
  • mybatis?查詢返回Map<String,Object>類型

    mybatis?查詢返回Map<String,Object>類型

    本文主要介紹了mybatis?查詢返回Map<String,Object>類型,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03

最新評論