二级缓存

    hibernate的session提供了一级缓存,在同一个session中对同一个id的对象load两次,并不会发送两条sql给数据库。但是session关闭的时候,一级缓存就失效了。

    二级缓存是SessionFactory级别的全局缓存,它底下可以使用不同的缓存类库,比如ehcache、oscache等,需要使用缓存实现方案。

    详细请看: hibernate二级缓存攻略

 3.1 基本设置

1. 如果需要特别设置ehcache的属性,把一个ehcache.xml 定义文件拷贝到class-path.

2. jdbc.properties加上

hibernate.cache.use_query_cache=true
hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider

3. applicationContext.xml的 <property name="hibernateProperties">下加上

<prop key="hibernate.cache.use_query_cache">$ {hibernate.cache.use_query_cache}</prop>
<prop key="hibernate.cache.provider_class">$ {hibernate.cache.provider_class}</prop>

3.2 Entity级二级缓存

   Entity二级缓存是把PO放进cache,缓存的key就是ID,value是POJO,不同于查询的缓存。

   Entity二级缓存在BookDao.get(3),和book.getCategory()的情况下都能用到,把category这样的小表完全cache到内存挺不错的。

在hbm文件中: 

<class name="Product" table="PRODUCT" dynamic-insert="true" dynamic-update="true">
<cache usage="nonstrict-read-write"/>
<id name="id" column="ID">
<generator class="native"/>
</id>

   如果你使用的二级缓存实现是ehcache的话,需要配置ehcache.xml ,否则就会使用ehcache默认的配置

<cache name="com.xxx.pojo.Foo" maxElementsInMemory="500" eternal="false" timeToLiveSeconds="7200" timeToIdleSeconds="3600" overflowToDisk="true" />

3.3 查询缓存

   上面的二级缓存是针对单个对象的,如果要对查询结果,则是用下面的语句

query.setCacheable(true);//激活查询缓存
query.setCacheRegion("myCacheRegion");//指定要使用的cacheRegion,可选

   cacheRegion是可选的,可以对使用的缓存进行特殊设置, 在ehcahe.xml里要补上下面的一段。

<cache name="myCacheRegion" maxElementsInMemory="10" eternal="false" timeToIdleSeconds="3600" timeToLiveSeconds="7200" overflowToDisk="true" />