Hibernate深入探討

Hibernate 緩存策略

一級緩存:session,hibernate的自主緩存

二級緩存(Ehcache)

Read-only

Nonstrict-read-write

Read-write(關鍵事務)

Transactional(事務型緩存<Ehcache不支持此模式>)

二級緩存還有JbossCache的,它支持事務型緩存,但是Jboss的資料很難得,還是開源的Ehcache對我的口味,並且他作爲hibernate的默認緩存策略,表現實在也很不錯的J

Ehcache在Spring+hibernate的應用中是很簡單的,只要聲明Ehcache的緩存管理器,並且定義ehcache的xml文件就可以了。

Hibernate 鎖策略

Hibernate 內部鎖機制

LockMode.NONE 無鎖機制

LockMode.WRITE hibernate 進行保存和更新時自動使用的鎖機制。

LockMode.READ hibernate讀取紀錄時的機制

悲觀鎖

整個數據處理過程中,將數據處於鎖定
狀態。悲觀鎖的實現,往往依靠數據庫提供的鎖機制

LockMode.UPGRADE

LockMode.UPGRADE_NOWAIT

實現機制如下:

Criteria.setLockMode

Query.setLockMode

Session.lock

樂觀鎖

Why 樂觀鎖?

更加寬鬆的加鎖機制,悲觀鎖對長事務而言,開銷往往無法承受;避免死鎖。

實現機制:

Version

Dirty

ALL

主要介紹 Version

官方推薦的樂觀鎖實現策略,廣泛使用,具有經驗可借鑑性

實現舉例:在每一次進行讀取操作時取出版本號,在進行更新時同時刷新版本號,更新時只能更新低版本的數據,從而完成鎖策略。Hibernate的Session會在等待用戶交互時,Session斷開數據庫連接。在整個應用事務過程中,Hibernate使用單例Session和單例類來實現。

使用方法:

<class name="mtn.gfkd.spring.model.TUser" table="T_USER" schema="SPRINGDEV" optimistic-lock="version">

<主鍵>

<version
column="version"
name="version"
type="java.lang.Integer"
/>

同時數據庫表中增加字段àversion

總結:在一般性的事務中,大可將鎖機制拋開不用,這樣不可否認增加了複雜性,你不得不面對不少的版本異常信息,只有在涉及關鍵業務如進行網上購物的付款等就必須進行加鎖管理,當然推薦基於version的樂觀鎖管理。

Hibernate 數據加載

Session.createQuery.list()

Session.createQuery. iterate()à遍歷,sql語句執行爲1,1,1 爲什麼還要選用他?

Session.get/Load

區別何在?

Session緩存/一、二級緩存

QueryCache機制

Hibernate 批量數據處理

主要問題在於批量操作後的緩存問題!

批量刪除例子:

Query query=session.createQuery(delete TUser)

Int ret=query.executeUpdate();

通過高效的JDBC接口批量刪除數據後,Session中的緩存,二級緩存並沒有清除!!

此時的session.load(TUser,1) 還有數據,顯然需要手工的處理。

一個小小的規則

One-many配置時,inverse屬性的設置總是將many一方設置爲主控方(inverse=false)

區分cascade與inverse的區別

Cascadeà級連關係

Inverseà關係維護控制方向

n 沒有工具可以限制我們,限制我們的僅僅是我們自己的想象力而已。

以上是我的一個hibernate講座的ppt所整理,難免有些不清楚,以後有時間慢慢補齊了J
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章