Hibernate三種裝套,緩衝,以及update更新問題

來源:互聯網
上載者:User

標籤:date()   mit   keyword   .class   持久化對象   做了   student   put   就會   

一. Hibernate中對象的三種狀態

1. 瞬時狀態(transient)

    當我們通過Java的new關鍵字來產生一個實體物件時,這時這個實體物件就處於自由狀態,此時該對象只是通過JVM獲得了一塊記憶體空間,還並沒有通過Session對象的save()方法儲存進資料庫,因此也就還沒有納入Hibernate的緩衝管理中,也就是說該對象現在還自由的遊盪於Hibernate緩衝管理之外。所以我們可以看出自由對象最大的特點就是,在資料庫中不存在一條與它對應的記錄。

    瞬時狀態特點:

    I: 不和 Session 執行個體關聯;  

    II: 在資料庫中沒有和瞬時對象關聯的記錄

2. 持久狀態(persistent)

    持久化對象就是已經被儲存進資料庫的實體物件,並且這個實體物件現在還處於Hibernate的緩衝管理之中。這是對該實體物件的任何修改,都會在清理緩衝時同步到資料庫中。

    持久狀態特點:

    I: Session 執行個體關聯

    II: 在資料庫中有和持久對象關聯的記錄

3. 游離狀態(detached)

    當一個持久化對象,脫離開Hibernate的緩衝管理後,它就處於游離狀態,游離對象和自由對象的最大區別在於,游離對象在資料庫中可能還存在一條與它對應的記錄,只是現在這個游離對象脫離了Hibernate的緩衝管理,而自由對象不會在資料庫中出現與它對應的資料記錄。

    脫管對象特點:

    I: 本質上和瞬時對象相同

    II: 只是比愛瞬時對象多了一個資料庫記錄標識值 id.

 

三種狀態相互轉化的狀態圖如下:

 

 

二. Hibernate執行update操作會訪問資料庫幾次

    首先你要知道Hibernate執行update的運行機理,Hibernate的update是怎麼樣自動進行update操作的呢?

   (1). hibernate會執行一個select操作,到資料庫中尋找,當前要update操作的對象的主鍵是否存在,類似於:

         select id from table where id=xxx;

   (2).執行更新操作

       I: 如果查到了該ID,就說明該對象是一個持久化對象,如果該對象的某些屬性變化了,Hibernate就會自動的執行update操作,同步資料庫中的該對象。

       II: 如果Hibernate沒有尋找到該ID,就說明該對象是一個游離的對象,Hibernate就會自行insert操作。

根據這些,就可以明白要update的對象的ID在資料庫中不存在,或者更改該對象的ID,這些都是執行insert而不是update。

 

三. Hibernate中一級緩衝和二級緩衝

1. 一級緩衝二級緩衝的概念解析

(1)一級緩衝就是Session層級的緩衝,一個Session做了一個查詢操作,它會把這個操作的結果放在一級緩衝中,如果短時間內這個

session(一定要同一個session)又做了同一個操作,那麼hibernate直接從一級緩衝中拿,而不會再去連資料庫,取資料;

(2)二級緩衝就是SessionFactory層級的緩衝,顧名思義,就是查詢的時候會把查詢結果緩衝到二級緩衝中,如果同一個sessionFactory

建立的某個session執行了相同的操作,hibernate就會從二級緩衝中拿結果,而不會再去串連資料庫;

(3)Hibernate中提供了兩級Cache,第一層級的緩衝是Session層級的緩衝,它是屬於事務範圍的緩衝。這一層級的緩衝由hibernate管理

的,一般情況下無需進行幹預;第二層級的緩衝是SessionFactory層級的緩衝,它是屬於進程範圍或群集範圍的緩衝。這一層級的緩

存可以進行配置和更改,並且可以動態載入和卸載。 Hibernate還為查詢結果提供了一個查詢快取,它依賴於第二級緩衝;

2. 一級緩衝二級緩衝的比較

(1)第一級緩衝 第二級緩衝 存放資料的形式相互關聯的持久化對象 對象的散裝資料 緩衝的範圍事務範圍,每個事務都有單獨的第一級

緩衝進程範圍或叢集範圍,緩衝被同一個進程或叢集範圍內的所有事務共用並發存取原則由於每個事務都擁有單獨的第一級緩衝,不

會出現並發問題,無需提供並發存取原則由於多個事務會同時訪問第二級緩衝中相同資料,因此必須提供適當的並發存取原則,來保

證特定的交易隔離等級資料到期策略沒有提供資料到期策略。

(2)處於一級緩衝中的對象永遠不會到期,除非應用程式顯式清空緩衝或者

清除特定的對象必須提供資料到期策略,如基於記憶體的緩衝中的對象的最大數目,允許對象處於緩衝中的最長時間,以及允許對象處

於緩衝中的最長空閑時間實體儲存體介質記憶體記憶體和硬碟。

(3)對象的散裝資料首先存放在基於記憶體的緩衝中,當記憶體中對象的數目達到數

據到期策略中指定上限時,就會把其餘的對象寫入基於硬碟的緩衝中。

(4)緩衝的軟體實現在Hibernate的Session的實現中包含了緩衝的

實現由第三方提供,Hibernate僅提供了緩衝適配器(CacheProvider)。用於把特定的快取區外掛程式整合到Hibernate中。

(5)啟用緩衝的方式

只要應用程式通過Session介面來執行儲存、更新、刪除、載入和查詢資料庫資料的操作,Hibernate就會啟用第一級緩衝,把資料庫

中的資料以對象的形式拷貝到緩衝中,對於批次更新和大量刪除操作,如果不希望啟用第一級緩衝,可以繞過Hibernate API,直接

通過JDBC API來執行指操作。

(6)使用者可以在單個類或類的單個集合的粒度上配置第二級緩衝。如果類的執行個體被經常讀但很少被修改,就

可以考慮使用第二級緩衝。

(7)只有為某個類或集合配置了第二級緩衝,Hibernate在運行時才會把它的執行個體加入到第二級緩衝中。

使用者管理緩衝的方式第一級緩衝的物理介質為記憶體,由於記憶體容量有限,必須通過恰當的檢索策略和檢索方式來限制載入對象的數目。

Session的 evit()方法可以顯式清空緩衝中特定對象,但這種方法不值得推薦。第二級緩衝的物理介質可以是記憶體和硬碟,因此第二

級緩衝可以存放大量的資料,資料到期策略的maxElementsInMemory屬性值可以控制記憶體中的對象數目。

(8)管理第二級緩衝主要包括兩個方面:選擇需要使用第二級緩衝的持久類,設定合適的並發存取原則:選擇緩衝適配器,設定合適的資料到期策略。

3. 一級緩衝的管理

(1)當應用程式調用Session的save()、update()、savaeOrUpdate()、get()或load(),以及調用查詢介面的 list()、iterate()或

filter()方法時,如果在Session緩衝中還不存在相應的對象,Hibernate就會把該對象加入到第一級緩衝中。當清理緩衝時,

Hibernate會根據緩衝中對象的狀態變化來同步更新資料庫。 Session為應用程式提供了兩個管理緩衝的方法: evict(Object obj)

:從緩衝中清除參數指定的持久化對象。 clear():清空緩衝中所有持久化對象。

(2)save、update、saveOrupdate、load、list、iterate、lock會向一級緩衝存放資料;

 1 save 案例: 2     //添加一個學生 3             Student student=new Student(); 4             student.setName("小東"); 5  6             s.save(student);//放入一級緩衝 7  8             //我馬上查詢 9             Student stu2=(Student) s.get(Student.class, student.getId()); //select10             System.out.println("你剛剛加入的學生名字是"+stu2.getName());

(3)什麼操作會從一級緩衝取資料:get、load、list

get / load 會首先從一級緩衝中取,如沒有.再有不同的操作[get 會立即向資料庫發請求,而load 會返回一個代理對象,直到使用者真的去使用資料,才會向資料庫發請求;

//查詢45號學生

 1 save 案例: 2     //添加一個學生 3             Student student=new Student(); 4             student.setName("小東"); 5  6             s.save(student);//放入一級緩衝 7  8             //我馬上查詢 9             Student stu2=(Student) s.get(Student.class, student.getId()); //select10             System.out.println("你剛剛加入的學生名字是"+stu2.getName());

從上面的案例,我們看出 query.list() query.uniueResut() 不會從一級緩取資料! 但是query.list 或者query.uniqueRestu() 會向一級緩衝放資料的.

注意:

① 一級緩衝不需要配置,就可以使用,它本身沒有保護機制,所以我們程式員要考慮這個問題,我們可以同 evict 或者 clear來清除session緩衝中對象. evict 是清除一個對象,clear是清除所有的sesion緩衝對象

② session級緩衝中對象的生命週期, 當session關閉後,就自動銷毀.

③ 我們自己用HashMap來類比一個Session緩衝,加深對緩衝的深入.

4.Hibernate二級緩衝的管理

I. Hibernate二級緩衝策略的一般過程如下:

1) 條件查詢的時候,總是發出一條select * from table_name where …. (選擇所有欄位)這樣的SQL語句查詢資料庫,一次獲得所有的資料對象。

2) 把獲得的所有資料對象根據ID放入到第二級緩衝中。

3) 當Hibernate根據ID訪問資料對象的時候,首先從Session一級緩衝中查;查不到,如果配置了二級緩衝,那麼從二級緩衝中查;查不到,再查詢資料庫,把結果按照ID放入到緩衝。

4) 刪除、更新、增加資料的時候,同時更新緩衝。

Hibernate二級緩衝策略,是針對於ID查詢的緩衝策略,對於條件查詢則毫無作用。為此,Hibernate提供了針對條件查詢的Query Cache。

5) 二級緩衝的對象可能放在記憶體,也可能放在磁碟.

II. 什麼樣的資料適合存放到第二級緩衝中?

1) 很少被修改的資料

2) 不是很重要的資料,允許出現偶爾並發的資料

3) 不會被並發訪問的資料

4) 參考資料,指的是供應用參考的常量資料,它的執行個體數目有限,它的執行個體會被許多其他類的執行個體引用,執行個體極少或者從來不會被修改。

III. 不適合存放到第二級緩衝的資料?

1) 經常被修改的資料

2) 財務資料,絕對不允許出現並發

3) 與其他應用共用的資料。

IV. 常用的快取區外掛程式 Hibernater二級緩衝是一個外掛程式,下面是幾種常用的快取區外掛程式:

◆Ehcache:可作為進程範圍的緩衝,存放資料的物理介質可以是記憶體或硬碟,對Hibernate的查詢快取提供了支援。

◆OSCache:可作為進程範圍的緩衝,存放資料的物理介質可以是記憶體或硬碟,提供了豐富的快取資料到期策略,對Hibernate的查詢

緩衝提供了支援。

◆SwarmCache:可作為群集範圍內的緩衝,但不支援Hibernate的查詢快取。

◆JBossCache:可作為群集範圍內的緩衝,支援事務型並發存取原則,對Hibernate的查詢快取提供了支援。

V. 配置Hibernate二級緩衝的主要步驟:

1) 選擇需要使用二級緩衝的持久化類,設定它的具名快取的並發存取原則。這是最值得認真考慮的步驟。

2) 選擇合適的快取區外掛程式,然後編輯該外掛程式的設定檔。

 1 <property name="hbm2ddl.auto">update</property> 2     <!-- 啟動二級緩衝 --> 3     <property name="cache.use_second_level_cache">true</property> 4     <!-- 指定使用哪種二級緩衝 --> 5     <property name="cache.provider_class">org.hibernate.cache.OSCacheProvider</property> 6     <mapping resource="com/hsp/domain/Department.hbm.xml" /> 7     <mapping resource="com/hsp/domain/Student.hbm.xml" /> 8     <!-- 指定哪個domain啟用二級緩衝  9     特別說明二級緩衝策略:10     1. read-only11     2. read-write12     3. nonstrict-read-write13     4. transcational14     -->15     <class-cache usage="read-write"/>

3)可以把oscache.properties檔案放在 src目錄下,這樣你可以指定放入二級緩衝的對象capacity 大小. 預設1000

VI.使用二級緩衝:

 1 // TODO Auto-generated method stub 2         //通過擷取一個sesion,讓hibernate架構運行(config->載入hibernate.cfg.xml) 3         Session s=null; 4         Transaction tx=null; 5  6         try { 7             //我們使用基礎模板來講解. 8             s=HibernateUtil.openSession(); 9             tx=s.beginTransaction();10 11             //查詢45號學生12 13             Student stu1=(Student) s.get(Student.class, 45);//45->一級緩衝        14             System.out.println(stu1.getName());15 16             tx.commit();17 18         } catch (Exception e) {19             e.printStackTrace();20             if(tx!=null){21                 tx.rollback();22             }23         }finally{24 25             if(s!=null && s.isOpen()){26                 s.close();27             }28         }29 30         System.out.println("*********************************");31         try {32             //我們使用基礎模板來講解.33             s=HibernateUtil.openSession();34             tx=s.beginTransaction();35 36             //查詢45號學生37 38             Student stu1=(Student) s.get(Student.class, 45);    39             System.out.println(stu1.getName());40 41             Student stu3=(Student) s.get(Student.class, 46);    42             System.out.println(stu3.getName());43                 tx.commit();44 45         } catch (Exception e) {46             e.printStackTrace();47             if(tx!=null){48                 tx.rollback();49             }50         }finally{51 52             if(s!=null && s.isOpen()){53                 s.close();54             }55         }56 57         //完成一個統計,統計的資訊在Sessfactory58         //SessionFactory對象.59         Statistics statistics= HibernateUtil.getSessionFactory().getStatistics();60         System.out.println(statistics);61         System.out.println("放入"+statistics.getSecondLevelCachePutCount());62         System.out.println("命中"+statistics.getSecondLevelCacheHitCount());63         System.out.println("錯過"+statistics.getSecondLevelCacheMissCount());

在配置了二級緩衝後,請大家要注意可以通過 Statistics,查看你的配置命中率高不高

 

 



Hibernate三種裝套,緩衝,以及update更新問題

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.