生活就像一杯咖啡,讓你我慢慢的品嘗,品嘗它的苦澀和甘甜......
一、什麼是Hibernate緩存。
解析:白話來說就是緩存數據的容器
官方標准點緩存:是計算機領域的概念,它介於應用程序和永久性數據存儲源之間。
作用:降低應用程序直接讀寫數據庫的頻率,從而提高程序的運行性能。緩存中的數據是數據存儲源中數據的拷貝。緩存的物理介質通常是內存。
二、緩存一般分為三個類
一級緩存
二級緩存
查看緩存
三、一級緩存
場景一:使用同一個session連續查詢兩次同一個對象
/查詢學生信息 public static void select(){ //由班級查詢該班級學生信息 Session session=HibernateUtil.currentSession(); Grade grade=(Grade) session.get(Grade.class, 14); //輸出班級信息 System.out.println(grade.getGname()); Grade grade2=(Grade) session.get(Grade.class, 14); //輸出班級信息 System.out.println(grade2.getGname()); }
執行結果:
場景一:在第一次查詢完畢後,關閉session對象,重新開啟一個session然後繼續查詢同一個對象
//查詢學生信息 public static void select(){ //由班級查詢該班級學生信息 Session session=HibernateUtil.currentSession(); Grade grade=(Grade) session.get(Grade.class, 14); //輸出班級信息 System.out.println(grade.getGname()); //關閉session HibernateUtil.closeSession(); //重新獲取session session=HibernateUtil.currentSession(); Grade grade2=(Grade) session.get(Grade.class, 14); //輸出班級信息 System.out.println(grade2.getGname()); }
執行結果:
解析:
1:當我沒有關閉session時用的同一個session兩次訪問同一個對象時,只會向DB端發送一條sql語句
* 原因:因為我第一次訪問數據庫的時候Hibernate會自動的將我查詢出來的結果保留一份查詢出來的對象到一級緩存
並且這個額對象是根據OID唯一標識的,也可以理解為數據庫中的主鍵值,然後當我再一次訪問一個對象時,Hibernate
機制會自動的先去一級緩存中查找看有沒有OID與我要查詢的OID相同的對象,如果有的話,則直接從一級緩存中 拿數據
如果沒有相同的OID則說明緩存中沒有我要的記錄,那麼就會直接去訪問DB端了,這樣的話,又會重新發送一條sql
2:當我第一次查詢完數據後立即關閉session,這時重新開啟一個session來訪問同一個對象,這時我們會發現它居然向數據庫發送了兩條Sql語句。這是為什麼呢?
* 原因:其實原因很簡單,因為我們雖然說是訪問的同一個對象,但是我們隨即就關閉了這個session而重新開啟了一個session,
此時我們訪問時的session是不一致的也就是說是兩個不同的session發出的請求,這樣理解的話,我們就不難理解了。
所以總結出,一級緩存是一個會話級別的緩存,當一次回話結束後該會話裡的緩存則會全部的銷毀,所有我們自然就只能重新發送一條sql啦。
3補充以下方法支持一級緩存
四、二級緩存
(一)配置二級緩存
1.引入如下jar包。
ehcache-1.2.3.jar 核心庫
backport-util-concurrent.jar
commons-logging.jar
2.配置Hibernate.cfg.xml開啟二級緩存
<property name="hibernate.cache.use_second_level_cache">true</property>
3.配置二級緩存的供應商
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
4.指定使用二級緩存的類
方案一:在*.hbm.xml中配置
在<class元素的子元素下添加chche子節點,但該配置僅會緩存對象的簡單屬性,若希望緩存集合屬性中的元素,必須在set元素中添加<cache>子元素