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
一級緩存: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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.