Hibenrnate之緩存(一)

概述:


    Hibernate是一個持久層框架,經常訪問物理數據庫。爲了降低應用程序對物理數據源訪問的頻次,從


提高應用程序的運行性能,緩存的合理使用就尤爲重要。緩存內的數據是對物理數據源中的數據的複製,


用程序在運行時從緩存讀寫數據,在特定的時刻或事件會同步緩存和物理數據源的數據。


一級和二級緩存:


計算機生成了可選文字:S"slon內,不目被卸載義、‘。n的透存是,務範豆不典卜一級飯存中擠久化裏的公個立甸筱異有唯一獷,:..一州..……。......……,。‘一如一級(Session)一白醚扮丈魚屍叢些匹魚也斑貓‘雲蓬~;一~冬、”"'存放數胭的方式~入一到,妥麗乃鯉~一今又止絲生叫甸、,..一!Hib晰at.=級姍存是班口範.成有抽羣範口的飯存有可叫出硯井,引面因此翻鉀採用適當的井發訪問抽咚東多貨略允被透俘史匆搶甩七,整爾二嗯石並知方問蔽蔽甭飛州癱麗卜物理介質續每吹件實硯於州存在形式卜屍樁,耳任卜HIb帥at創祖供70,hi比mat.c邢h,cac卜”p,o己”r碑口它二蘭,譯卜十一卜刃,三一雲冬樸..1…,.'..--一對比:,,,........-::一、、使用1.:兄:.的刁、會敵月發訪問「戶教據白動用辰飛叫迪竺紅…“.…,.......一‘...……一州二級(5essionFactory)41常從效握“·一”..,..."".."~”一了一州!理翻ic嘆Oa".rgo)·…二“'‘一的~久化放扮、二級疲存中.俘硯二二二,:二:存二\型絲列魚些些業衛一聖常用播件一,


應用原理:


    當Hibernate根據ID訪問數據對象的時候,首先從Session一級緩存中查;查不到,如果配置了二級緩


存,那麼從二級緩存中查;如果都查不到,再查詢數據庫,把結果按照ID放入到緩存刪除、更新、增加數據


的時候,同時更新緩存。

 

一級緩存的應用:


    當session對象調用save()方法保存一個對象後,該對象會被放入到session的緩存中。get()和


load()。當session對象調用get()或load()方法從數據庫取出一個對象後,該對象也會被放入到session的緩


存中。使用HQL和QBC等從數據庫中查詢數據。

 

<span style="font-size:18px;">public class Client
{
    public static void main(String[] args)
    {
        Session session =HibernateUtil.getSessionFactory().openSession();
        Transaction tx = null;
        try
        {
            /*開啓一個事務*/
            tx =session.beginTransaction();
            /*從數據庫中獲取id="001"的Person對象*/
            Person person= (Person )session.get(Person .class,"001");
            System.out.println("person.getUsername is"+person.getUsername());
            /*事務提交*/
            tx.commit();
            
           System.out.println("-------------------------------------");
            
            /*開啓一個新事務*/
            tx =session.beginTransaction();
            /*從數據庫中獲取id="402881e534fa5a440134fa5a45340002"的Customer對象*/
            Person person1= (Person )session.get(Person .class,"001");
            System.out.println("person1.getUsername is"+person1.getUsername());
            /*事務提交*/
            tx.commit();
            
           System.out.println("-------------------------------------");
            
            /*比較兩個get()方法獲取的對象是否是同一個對象*/
            System.out.println("person== person1result is "+(person==person1));
        }
        catch (Exceptione)
        {
            if(tx!=null)
            {
                tx.rollback();
            }
        }
        finally
        {
            session.close();
        }
    }
}</span>


結果:


Hibernate: 
    select
        person0_.id asid0_0_,
        person0_.username asusername0_0_,
        person0_.balance asbalance0_0_ 
    from
       person person0_ 
    where
        person0_.id=?
person.getUsernameislisi
-------------------------------------
person.getUsernameislisi
-------------------------------------
person== person1result is true

    結果中只包含了一條SELECTSQL語句,而且person==person1 result istrue說明兩個取出來的對象是


一個對象。其原理是:第一次調用get()方法,Hibernate先檢索緩存中是否有該查找對象,發現沒有,


Hibernate發送SELECT語句到數據庫中取出相應的對象,然後將該對象放入緩存中,以便下次使用,第二次調


用get()方法,Hibernate先檢索緩存中是否有該查找對象,發現正好有該查找對象,就從緩存中取出來,不


再去數據庫中檢索。

 

總結:


   Hibernate 的緩存只從下面兩個方面發生作用 :1.通過主鍵值加載對象 2.延遲加載 。通過主鍵值


加載就會存在N+1問題,我們將在下篇文章介紹通過二級緩存解決N+1問題。而延遲加載實現要解決兩個問


題:

  

  1.正常關閉連接和確保請求中訪問的是同一個session。


  2.http請求結束後正確的關閉session(過濾器實現了session的正常關閉),延遲加載必須保證是同一個


   session(session綁定在ThreadLocal)。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章