hibernate 二级缓存(二)

转自 http://terryjs.iteye.com/blog/751471

1 启用 Hibernate 二级缓存

Hibernate 二级缓存分为两部分, class 缓存和查询缓存,其获取对象的方式有所不同,但两者也有联系,查询缓存必须以 class 缓存为基础才能起作用,否则只会使效率更低。

我们这里使用的二级缓存是通过 ehcache 第三方插件实现的。

1.1 配置 Hibernate.cfg.xml

启用 class 缓存:

             

public List findByCachedQuery(final String hql)   
  
   {   
  

       return (List) getHibernateTemplate().execute(new HibernateCallback() {   

  

           public Object doInHibernate(Session session) throws HibernateException {   

  
               Query queryObject = session.createQuery(hql);   
  

               queryObject.setCacheable(true);   

  

               if (getHibernateTemplate().getQueryCacheRegion() != null) {   

  
                   queryObject.setCacheRegion(getHibernateTemplate().getQueryCacheRegion());   
  
               }   
  

               return queryObject.list();   

  
           }   
  

       }, true);   

  
   }  
public List findByCachedQuery(final String hql)

    {

        return (List) getHibernateTemplate().execute(new HibernateCallback() {

            public Object doInHibernate(Session session) throws HibernateException {

                Query queryObject = session.createQuery(hql);

                queryObject.setCacheable(true);

                if (getHibernateTemplate().getQueryCacheRegion() != null) {

                    queryObject.setCacheRegion(getHibernateTemplate().getQueryCacheRegion());

                }

                return queryObject.list();

            }

        }, true);

    }
 

 

这样,将只在 session 范围内启用查询缓存,一旦该 session 结束了,那么查询缓存也将回复默认配置。

注意:使用时只支持 hql 。

4 注意事项

       在使用二级缓存时,注意,所有对数据库的修改都必须走hibernate,如果从其他系统来或使用sql语句来修改数据库相关记录,那么将对二级缓存的数据不会造成影响,换句话说,缓存中的对象数据将和数据库中的不一致。

 

相关推荐