Hibernate中的Session快取問題
1. Session 快取:
1) . 在 Session 介面的實現中包含一系列的 Java 集合 , 這些 Java 集合構成了 Session 快取 .
它用於存放 Session 關聯的物件( Session 關聯物件的方式有很多種。
例如:session.get (Class , OID )、 session.update()、 session.save () ...)。
只要 Session 例項沒有結束生命週期 , 且沒有清理快取,則存放在它快取中的物件也不會結束生命週期。
Session 快取可減少 Hibernate 應用程式訪問資料庫的頻率。
2) . 操作 Session 快取的方法(瞭解一下吧)。
①. 若呼叫 session.get () 從資料庫中載入一個物件,則該物件會被納入到 Session 快取中。
News news = (News ) session.get (News.class , 1);
//會向資料庫傳送 SQL 嗎 ? 不會傳送 SQL 語句 , 而是從 Session 快取獲取物件的引用(快照)
News news2 = (News ) session.get (News.class , 1);
②. Session 的 clear() 方法可以清空 Session 的快取
News news = (News) session.get(News.class, 1);
//清理
session 快取
session.clear ();
//會向資料庫傳送 SQL 嗎 ? 會 ! 因為 Session 快取被清空了 !
News news2 = (News ) session.get (News.class , 1);
③. Session 的 flush() 方法:
清理快取 - 強制使資料庫記錄和 Session 快取中物件狀態保持一致,可能會傳送 SQL 語句
(若資料庫記錄和 Session 中物件狀態不一致,則傳送 SQL,否則不傳送 SQL)
I. 預設情況下,提交事務時,會先清理快取,然後再提交事務
II. 若主鍵生成方式使用的是資料庫底層的自增長方式,會在執行 Session 的 save() 方法時,就清理快取,執行 INSERT 語句,而不是等到提交事務時。 Hibernate 要求和 Session 關聯的物件必須有和資料表記錄對應的 OID,這就意味著執行 save() 方法後,必須有 OID ,而底層自增長的方式生成主鍵,必須先執行 INSERT 才能獲取主鍵值
//若使用 MySQL 底層自增的方式生成主鍵, save() 方法即會引起傳送 INSERT 語句
session.save (news );
System.out.println (news.getId ());
III. 使用 HQL(Hibernate
Query Language )查詢記錄時,不經過 Session 快取!直接查詢資料庫,且要求查詢的結果是最新的!
所以,在進行 HQL 查詢之前需要先清理快取
session.save(news);
//會導致清理快取
News news2 = (News) session.createQuery ("FROM
News n WHERE n.id = ?" )
.setInteger (0 , news.getId ()).uniqueResult ();
IV. commit() 和 flush() 方法的區別:
flush 執行一系列 sql 語句,但不提交事務;
commit 方法先呼叫flush() 方法,然後提交事務 . 意味著提交事務對資料庫的操作永久儲存下來。
④.
refresh () 方法:
強制使 Session 快取中的物件的狀態和資料庫記錄保持一致。所以會強制傳送一條 SELECT 語句。
注意,因為 MySQL 的預設的隔離級別為 READ
REPTABLE 。所以需要設定事務的隔離級別才能看到實驗的效果
<!-- 設定 Hibernate 的事務的隔離級別, 設定為讀已提交 -->
<property
name ="connection.isolation" >2 </property >
相關文章
- 【hibernate】Session快取Session快取
- hibernate中的no session問題Session
- hibernate中lazy與二級快取問題快取
- 關於 Hibernate快取的問題快取
- hibernate二級快取問題!快取
- 請教hibernate 中session問題Session
- Hibernate的session問題Session
- Hibernate的一級快取Session和二級快取SessionFactory快取Session
- Spring與Hibernate整合中的session問題SpringSession
- Hibernate一級快取(session)與二級快取(sessionFactory)的知識點。快取Session
- mybatis一級快取(session cache)引發的問題MyBatis快取Session
- 快取的問題快取
- 快取同步的問題快取
- vue中methods中的方法閉包快取問題Vue快取
- 配置session——快取Session快取
- Hibernate 的一級快取快取
- Hibernate的一級快取快取
- beego快取問題Go快取
- SOAP快取問題快取
- 快取問題(一) 快取穿透、快取雪崩、快取併發 核心概念快取穿透
- 專案中遇到的RediS快取問題及面試問題總結Redis快取面試
- 關於filter獲取session的問題!!!FilterSession
- hibernate的查詢快取薦快取
- hibernate中Blob,Clob欄位類行,二級快取的問題,哪位老大來指點指點快取
- 快取問題(四) 快取穿透、快取雪崩、快取併發 解決案例快取穿透
- hibernate的查詢快取和二級快取的配合使用快取
- 快取 Laravel 模型的小問題快取Laravel模型
- 關於JdonFramework的快取問題Framework快取
- BANG老師: 請教一下Hibernate的session問題Session
- 快取世界中的三大問題及解決方案快取
- hibernate中oracle的問題,,急啊?Oracle
- JQuery中ajax的使用與快取問題的解決方法jQuery快取
- Redis 面試常見問題———快取雪崩、快取擊穿以及快取穿透Redis面試快取穿透
- jquery ajax請教的快取問題jQuery快取
- nginx DNS 解析快取的更新問題NginxDNS快取
- jdon框架的aop和快取問題框架快取
- 請教關於快取的問題快取
- IE8快取問題快取