Hibernate中的Session快取問題

TZQ_DO_Dreamer發表於2014-11-06
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. 使用 HQLHibernate 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 >




相關文章