缓存大家应该都有用到吧,我也在不少项目中使用过,可是今天新弄了个项目hibernate换成3.6的版本了,报找不到org.hibernate.cache.EhCacheProvider类,费了好久才找到,原来在3.0后的版本中ehcache脱离出来了,或许是减少更少的依赖吧。所以说类的路径变成:net.sf.ehcache.hibernate.EhCacheProvider
接下来简单介绍下配置,若您使用过ehcache,下面的步骤就可以直接跳跃了:
1.导入jar,编写ehcache.xml,如下
<?xml version="1.0" encoding="UTF-8"?>
<ehcache>
<diskStore path="java.io.tmpdir"/>
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
</ehcache>
2.配置Hibernate属性
hibernate.cache.use_query_cache=true
hibernate.cache.use_second_level_cache=true
hibernate.cache.provider_class=net.sf.ehcache.hibernate.EhCacheProvider
注:如果不设置“查询缓存”,那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、 list()、Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置
hibernate.cache.use_query_cache true 才行
3.设置需要缓存的实体
@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
@Table(name = "qx_module")
public class Module implements java.io.Serializable {
4.若需要查询缓存,如下
private List findList(final boolean isHql, final String queryString,
final Map<String, Object> paramMap) {
return getHibernateTemplate().executeFind(new HibernateCallback() {
public Object doInHibernate(Session s) throws HibernateException,
SQLException {
Query query = null;
if (isHql) {
query = s.createQuery(queryString);
} else {
query = s.createSQLQuery(queryString);
}
if (null != paramMap && !paramMap.isEmpty()) {
query.setProperties(paramMap);
}
query.setCacheable(true); //启用查询缓存
return query.list();
}
});
}