標籤:
一、一級緩衝(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緩衝(一級緩衝、二級緩衝)