hibernate緩衝(一級緩衝、二級緩衝)

來源:互聯網
上載者:User

標籤:

一、一級緩衝(Session緩衝)     意義:提高hibernate查詢效率。     缺點:可能會因並發,產生資料不一致。    基於session的緩衝,利用hibernate執行查詢的時候,hibernate會首先從session緩衝去找,如果存在,則直接返回,如果不存在,則利用orm執行查詢,將得到的對象儲存至session緩衝。    可以使用session.evict(obj);將obj從session緩衝中移除。注意:一級緩衝,自動開啟hibernate一些與一級緩衝相關的操作:資料放入緩衝:1、save():當session對象調用save方法儲存一個對象後,該對象會被放入到session的緩衝中。(2)、get( )和load( ):當session對象調用get( )和load( )方法從資料庫中取出一個對象後,該對象也會被放入session的緩衝中。下面證明一下緩衝的存在:
 1 package com.it.test; 2 import org.hibernate.SessionFactory; 3 import org.hibernate.Transaction; 4 import org.hibernate.cfg.Configuration; 5 import org.hibernate.classic.Session; 6 import com.it.bean.UserInfo; 7 public class Test2 { 8      public static void main(String[] args) { 9          // TODO Auto-generated method stub10          //建立SessionFactory11          SessionFactory sessionfactory = null;12          //建立session13          Session session = null;14          //建立事務15          Transaction tx = null;16          try {17               sessionfactory = new Configuration().configure().buildSessionFactory();18               session = sessionfactory.getCurrentSession();19               //開啟事務20               tx=session.beginTransaction();21               UserInfo u = (UserInfo) session.get(UserInfo.class, "1001");22               System.out.println("-------");23               //清除緩衝,這裡如果沒有清除緩衝,那麼控制台就會只輸出一次查詢,當清除了緩衝後就會有輸出兩次查詢語句。這正好說明了緩衝的存在。24               session.evict(u);25               UserInfo u1 = (UserInfo) session.get(UserInfo.class, "1001");26               //提交27               tx.commit();28          } catch (Exception e) {29               e.printStackTrace();30               //交易回復31               tx.rollback();32          }33      }34 }
View Code資料從緩衝中清除:(1)、evict( ):將指定的持久化對象從緩衝中清除,釋放對象所佔的記憶體資源,指定對象從持久化狀態變為脫管狀態,從而成為游離對象。(2)、clear( ):將緩衝中的所有持久化對象清除,釋放其佔用的記憶體資源;其他快取作業:(1)、contains( ):判斷指定的對象是否存在於緩衝中。(2)、flush( ):重新整理緩衝區的內容,使之與資料庫保持同步。  二、二級緩衝(SessionFactory緩衝)   基於SessionFactory 的緩衝,利用hibernate執行查詢的時候,hibernate會首先從session緩衝去找,如果存在,則直接返回,如果不存在則去二級緩衝中去找,存在則返回,不存在則利用orm執行查詢,將得到的對象儲存至session緩衝,可以存至二級緩衝。          注意:二級緩衝需要在SessionFactory設定檔中,進行兩處配置。          a.配置啟用二級緩衝          b.配置二級緩衝實作類別          需要對緩衝本身進行專門的配置。(xxx.xml--配置緩衝)適用場合:頻繁查詢,海量資料,極少修改的對象。  三、消極式載入hibernate下消極式載入:load執行查詢時,返回hibernate代理對象,當操作其非主屬性時才會利用orm執行。eg:(部分代碼)
1 //消極式載入--用的時候才執行2               UserInfo u = (UserInfo) session.load(UserInfo.class, "1001");3               System.out.println("---1----");4               System.out.println(u.getUser_name());5 //輸出結果:查詢語句在------1-----後才執行,用到的時候再執行,且如果取得是主屬性,就不用查詢,因為load裡已經給了
View Code消極式載入可以在bean對應的xxxxx.hbm.xml檔案中設定lazy="false"(關閉了延時載入,就會變成即可載入) load和get的區別:     load                   get  預設:消極式載入   預設:即可載入  查不到:拋出異常     查不到:返回null 使用load需注意:操作非主屬性時要在事務提交之前使用(會報錯:org.hibernate.LazyInitializationException: could not initialize proxy - no Session);而使用get時在提交事務後仍能操作非主屬性。
 1 使用load:  //消極式載入--用的時候才執行 2              UserInfo u = (UserInfo) session.load(UserInfo.class, "1001"); 3              System.out.println("---1----");      4              tx.commit(); 5           //在事務提交之後操作非主屬性會拋異常:org.hibernate.LazyInitializationException            6 |          System.out.println(u.getUser_name());                                                   | 7 |--------------------------------------------------------------------------------------------------| 8 使用get:     //使用get 9               UserInfo u = (UserInfo) session.load(UserInfo.class, "1001");10               System.out.println("---1----");11               tx.commit();12                //在事務提交之後還能操作屬性,因為已經得到在之前已經得到了該對象13               System.out.println(u.getUser_name());          
View Code

 

hibernate緩衝(一級緩衝、二級緩衝)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.