Hibernate作為一種現在比較流行的輕量級的ORM框架年開始在國內流行到目前來說在做持久層上還是占有統治地位的雖然說豐富靈活的HQL和面對對象的Criteria查詢把程序員從復雜繁瑣的JDBC中解放了出來但作為持久層的框架它的性能才是最重要的核心問題而性能的核心在於緩存由於最近在學習這些所以就把自己的學到的一點東西拿來與大家分享希望能起到拋磚引玉的效果
在說這些之前的先說說hibernate實體對象的三種狀態
Transient所謂Transient就是說實體對象在內存中自有存在與數據庫中的記錄無關
PersientPersient對象對應數據庫中的一條記錄也可以這樣理解如果一個實體對象與某個session發生關聯並處於對應session的有效期內那它就處於Persient狀態
Detached所謂的Detached就是處於Persient狀態的對象對應的session關閉之後的狀態
我們平時所說的PO(持久化對象)指的就是位於Persient狀態的對象而VO(值對象)就是指Transient和Detached狀態的對象
下面開始說CRUD
保存hibernate中保存的方法很多我主要說說下面幾個
save()方法調用save方法時首先會在session緩存中查找保存對象如果實體對象已經處於Persient狀態直接返回否在實行sql操作並將保存的實體對象加入session緩存(save方法不會把實體加入二級緩存的)最後對存在的級聯關系進行遞歸處理
saveOrUpdate()方法和save方法一樣首先在session緩存中查找判斷對象是否為為保存狀態如果對象處於Persient不執行操作處於Transient執行save操作處於Detached調用save將對象與session重新關聯
這裡要注意的是批量操作時要適時對session進行flush操作避免OutOfMenoryError
刪除刪除我主要說批量刪除hibernate在進行批量刪除前首先必須將所有符合條件的數據加載到內存中(這是所有ORM框架必須面對的問題這樣主要是為了對目前的內部緩存和二級緩存中數據進行整理以保存和數據庫的一致性)這樣就面對這如果操作數據量過大也會出現OutOfMenoryError所以推薦使用迭代刪除
修改修改主要談談update方法update和前面的save一樣首先還是要進行在內部緩存中查找要注意兩點
Persient狀態的實體對象調用update沒有任何作用update的SQL將在sessionflush()方法中執行
查詢查詢是受緩存影響最大的主要談一下以下幾種查詢
load和get這兩者的區別主要是load會在二級緩存中查找而get在內部緩存中查找不到將跳過二級緩存直接進行sql操作
createQuery()的list()和iterate()方法list()實際上無法使用緩存的他對緩存只寫不讀而ierate則是首先查找所有符合條件的數據id(首先在本地緩存中查找)在執行相應的select獲得對應記錄iterate方法的使用最好是查找的實體對象在緩存已經存在否則查詢性能較低易產生N+現象
其實還有Query Cache但怕篇幅太長讓人煩所以就就此停筆其實緩存是一個很深問題也很值得研究
From:http://tw.wingwit.com/Article/program/Java/ky/201311/29110.html