本次測試使用MyEclipse2017,利用內置Hibernate3.3框架進行二級緩存機制的測試。
本次測試建立Person實體類,SessionFactory.java,hibernate.cfg.xml,Person.bhm.xml均由MyEclipse自動生成。
配置好數據庫中的table Person進行測試。
測試代碼:
Session session=HibernateSessionFactory.getSession();
Person person =(Person)session.get(Person.class,4);
System.out.println(person.getPname());
Person person1=(Person)session.get(Person.class, 4);
System.out.println(person1.getPname());
session.close();
結果:
此處出現一條查詢語句,因爲第一次的查詢和第二次相同,第二次直接使用緩存中的數據。
Session session=HibernateSessionFactory.getSession();
Person person =(Person)session.get(Person.class,4);
System.out.println(person.getPname());
Person person1=(Person)session.get(Person.class, 4);
System.out.println(person1.getPname());
session.close();
Session session2=HibernateSessionFactory.getSession();
person =(Person)session2.get(Person.class,4);
System.out.println(person.getPname());
session2.close();
結果:
此處新建session對象,使用同樣的實體對象,出現了第二條語句,因爲第一個session對象已被關閉,第二個對象新建產生,緩存已被清除,只能從數據庫中重新查詢獲得值。
Hibernate查詢策略:
條件查詢的時候,先通過select * from table_nam查詢數據庫,一次過的所用數據對象,將獲得的數據放入二級緩存中。
先到一級緩存去查數據,查不到,如果配置了二級緩存查詢,就去二級緩存,再找不到就去數據庫中查詢,將結果通過id存入緩存中。
在刪除更新增加數據時,同時更新緩存。
緩存策略主要針對ID查詢的緩存策略,對屬性查詢則毫無作用,爲此Hibernate針對條件查詢訂單Query Cache。
當服務器驅動時將公共部分數據全部放在二級緩存中。
一級:session級別的緩存,和session的生命週期共同存在,在這個週期中無論查詢相同數據多少次只能進行一次查詢語句。
二級:sessionFactory級別緩存,大數據公共全部使用sessionFacotry,爲全局類型緩存,sessionFactory的生存方式相同。
SessionFactory提供evict方法
通過session設置緩存的模式
NORMAL 從二級緩存讀寫數據
GET 從二級緩存讀取數據,僅在數據更新時對二級緩存寫數據
PUT 只向二級緩存寫數據,但不從二級讀數據
適合放在緩存的數據:
很少被修改的數據,不是很重要的書庫,允許出現偶爾併發的數據你不會被併發訪問的數據,參考數據,指的是供應用參考的實例引用,實例極少或者從來不修改。
不適合存放到緩存的數據:經常被修改的數據,財務數據,不允許出現併發,與其他應用共享的數據。
緩存配置文件:
ehcache.xml:將文件放在src下
hibernate.properties:
進入cfg.xml中進行配置:
<property name="hibernate.cache.use_second_level_cache">true</property>//開啓二級緩存
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>//修改緩存模式
<class-cache usage="read-only" class="cache.Person"/>//修改只讀
在配置之後運行報錯:
Caused by: java.lang.ClassNotFoundException: org.apache.commons.logging.LogFactory
需要導入日誌包commons-logging-1.1.3.jar。
由此開啓二級緩存之後修改session對象也不會增加查詢語句,只要在查詢第一次數據後就會將數據存入二級緩存,一遍下次繼續使用數據:
開啓緩存也可在Person.hbm.xml中完成配置: