Hibernate的Query缓存策略

来源:互联网 发布:三维编程叫什么 编辑:程序博客网 时间:2024/05/16 06:52

启用查询缓存的步骤:

1) 配置二级缓存:

Hibernate提供了三种和查询相关的缓存区域:

· 默认的查询缓存区域:org.hibernate.cache.StandardQueryCache

· 时间戳缓存区域:org.hibernate.cache.UpdateTimestampCache

· 用户自定义的查询缓存区域.

默认的查询缓存区域以及用户自定义的查询缓存区域都用于存放查询结果。而时间戳缓存区域存放了对与查询结果相关的表进行插入、更新或删除操作的时间戳。Hibernate通过时间戳缓存区域来判断被缓存的查询结果是否过期。所以,当应用程序对数据库的相关数据做了修改,Hibernate会自动刷新缓存的查询结果。但是如果其他应用程序对数据库的相关数据做了修改,则无法监测,此时必须由应用程序负责监测这一变化,然后手工刷新查询结果。Query接口的setForceCacheRefresh(true)可以手工刷新查询结果。

在ehcache.xml中添加如下配置:

<!-- 设置默认的查询缓存的数据过期策略 -->

<!-- 该配置应该写,否则会出现警告,若不写等于没有用查询缓存 -->

     < cache name="org.hibernate.cache.StandardQueryCache" 

       maxElementsInMemory="50"

       eternal="false" 

       timeToIdleSeconds="3600" 

       timeToLiveSeconds="7200" 

       overflowToDisk="true"/>

    <!-- 设置时间戳缓存的数据过期策略 -->

         <!-- 该配置应该写,否则会出现警告,若不写等于没有用查询缓存 -->

    < cache name="org.hibernate.cache.UpdateTimestampsCache" 

       maxElementsInMemory="5000"

       eternal="true" 

       overflowToDisk="true"/>

    < !-- 设置自定义命名查询缓存customerQueries的数据过期策略 -->

<!-- 该配置是自定义的查询缓存区域 -->

    < cache name="myCacheRegion"

        maxElementsInMemory="1000"

        eternal="false"

        timeToIdleSeconds="300"

        timeToLiveSeconds="600"

        overflowToDisk="true"

        /> 

2) 打开查询缓存:在hibernate.cfg.xml添加如下配置,由于查询缓存查询命中率比较低(Hibernate的自身机制造成),所以Hibernate的缺省值是:关闭,所以在使用查询缓存时要打开该缓存。

<!--启用查询缓存 -->

<property name="cache.use_query_cache">true</property> 

3)在程序中使用:

虽然按以上设置好了查询缓存,但Hibernate在执行查询语句语句时仍不会启用查询缓存。对于希望启用查询缓存的查询语句,应该调用Query接口的setCacheeable(true)方法:

测试类如下: 

/**

 *  演示查询缓存

 */

public void queryCache()

{

// 创建Session对象

Session session = sf.openSession();

// 创建HQL语句

String hql = "from PetInfo";

// 执行查询

Query query = session.createQuery(hql);

// 激活查询缓存

query.setCacheable(true);

// 使用自定义的查询缓存区域,若不设置,则使用标准查询缓存区域

query.setCacheRegion("myCacheRegion");

// 将查询结果赋给List对象

List<PetInfo> petList = query.list();

// 循环打印查询结果

for (int i=0;i<petList.size();i++)

{

// 循环得到PetInfo对象

PetInfo petInfo = petList.get(i);

System.out.println(petInfo.getPname());

}

// 关闭Session对象

session.close();

}

0 0
原创粉丝点击