緩存按應用范圍可分為三類:
事物級緩存即一級緩存session緩存:
存儲的當前session相關聯java對象
session緩存稱為hibernate的一級緩存
應用級緩存即二級緩存sessionFactory:
二級緩存根據目的和功能又可分為內置緩存和外置緩存。
內置緩存放置的是映射元數據和預定義SQL語句,內置緩存是只讀的,不可修改。
外置緩存是一個可配置的插件,在默認情況hibernate不會開啟這個插件。
外置緩存的存儲介質是內存或硬盤。
SessionFactory的外置緩存被稱為hibernate的二級緩存。
hibernate本身只提供二級緩存的規范,有第三方插件做具體實現。EHCache。
二級緩存存儲的對象分為:
類對象
集合對象
query查詢對象
集群范圍緩存
EHCache緩存在hibernate中的使用;
1.在主配置文件中要開啟二級緩存:
<property name="hibernate.cache.use_second_level_cache">true</property>
2.在主配置文件配置二級緩存區工廠:
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
3.指定緩存對象(可在映射關系中配置也可在主配置文件中配置)
0.導入Jar包和配置文件
1.<class-cache usage="read-only" class="指定的對象類"/>(主配置文件中配置)
2. <collection-cache usage="read-only" collection="指定的集合對象"/>(主配置文件中配置)
<!-- 指定類緩存集合 -->
<class-cache usage="read-only" class="com.layne.beans.Minister"/>
<class-cache usage="read-only" class="com.layne.beans.Country"/>
<!-- 指定集合緩存集合 -->
<collection-cache usage="read-only" collection="com.layne.beans.Country.ministers"/>
在映射關系配置文件中配置
<class name="Country"> <!-- 指定當前類為類緩存對象 --> <!-- <cache usage="read-only"/> --> <id name="cid"> <generator class="native"></generator> </id> <property name="cname"/> <!-- 對關系關聯映射關系 --> <set name="ministers" cascade="save-update" inverse="false"> <!-- 指定當前集合為緩存對象 --> <!-- <cache usage="read-only"/> --> <key column="countryId"/> <one-to-many class="Minister"/> </set> </class>
3.配置query查詢緩存對象
在主配置文件中開啟query緩存:<property name="hibernate.cache.use_query_cache">true</property>
query查詢的結果也是可以存到一二級緩存中,但Query查詢默認不會從緩存中讀取數據
要使用Query讀取緩存數據
1.在Hibernate.cfg.xml配置hibernate.cache.use_query_cache為true
2.要在Query語句添加 setCacheable(true):
Country country= (Country) session.createQuery(hql).setCacheable(true).uniqueResult();
Session的刷新與同步
Session的刷新是指,Session緩存中數據的更新。
Session的同步是指,將Session緩存中的數據同步更行到DB中。
執行同步的時間點只有一個:事物的提交。
刷新的時間點有三個:1.執行Query查詢 2.執行Session.flush() 3.執行事物的提交
當代碼中執行了對Session中現有數據的修改操作,即update()與delete()語句后,
Session緩存並不會馬上刷新。即並不會馬上執行update與delete的SQL語句。