本人在看Spring in action 2中的缓存的例子.在使用缓存时,发现他并没有走缓存,还是每次都在数据库中查询,望各位牛人指点一下.代码如下:public class RantSupportDAO extends HibernateDaoSupport implements RantDao {
    public List<Rant> getRantsForDay(Date day) {
        System.out.println("get result by method:getRantsForDay");
        return getHibernateTemplate().find("from Rant r where r.postedDate = ?", day);
    }    public void saveRant(Rant rant) {
        super.getHibernateTemplate().save(rant);
    }    public void updateRant(Rant rant) {
        super.getHibernateTemplate().update(rant);
    }    public static void main(String[] args) {
        ApplicationContext ctx = new ClassPathXmlApplicationContext(
                "com/roadrantz/dao/hibernate/roadrantz-cache.xml");
        RantSupportDAO dao = (RantSupportDAO) ctx.getBean("rantDaoTarget");
        Calendar c=Calendar.getInstance();
        c.set(2009,6,5);
        Date d=new Date(c.getTimeInMillis());        //第一次取结果集
        List<Rant> l = dao.getRantsForDay(d);
        Rant r = l.get(0);
        System.out.println(r.getName());
        
        //取完后,修改一下数据库的字段值,此方法并不刷新缓存
        Rant r2 = (Rant) ctx.getBean("rant");
        r2.setId(1l);
        r2.setName("wwb2");
        r2.setPostedDate(d);
        dao.updateRant(r2);        //第二次取结果集:为什么 还是走了查询?还是取到了修改后的字段?
        List<Rant> l3 = dao.getRantsForDay(d);
        Rant r3 = l3.get(0);
        System.out.println(r3.getName());
    }ehcache.xml配置文件如下:<ehcache>
    <defaultCache
            maxElementsInMemory="500"
            eternal="true"
            overflowToDisk="false"
            memoryStoreEvictionPolicy="LFU"/>
    <cache name="rantzCache"
           maxElementsInMemory="500"
           eternal="true"
           overflowToDisk="false"
           memoryStoreEvictionPolicy="LFU"/>
</ehcache>
spring配置文件如下:部分配置文件 <ehcache:config configLocation="classpath:com/roadrantz/dao/hibernate/ehcache.xml"/>
    <ehcache:proxy id="rantDao"
                   refId="rantDaoTarget">
        <ehcache:caching
                methodName="getRantsForDay"
                cacheName="rantzCache"/>
        <ehcache:flushing
                methodName="saveRant"
                cacheNames="rantzCache"/>
    </ehcache:proxy>
  <bean id="rantDaoTarget" class="com.roadrantz.dao.hibernate.RantSupportDAO">
        <property name="sessionFactory" ref="sessionFactory"/>
    </bean>

解决方案 »

  1.   

    public List find(String queryString) {
            List list = new ArrayList();
            try {
                HibernateTemplate template = getHibernateTemplate();
                template.setCacheQueries(true); //设置缓存
                if (StringUtils.isNotEmpty(queryCacheRegion))
                    template.setQueryCacheRegion(queryCacheRegion);
                list = template.find(queryString);
            } catch (Exception e) {
                throw new DaoException("", e);
            }
            return list;
        }
    用我写这个方式试一下,替换public List<Rant> getRantsForDay(Date day) 你这个方法
    或则你可以按我写的修改一下你的方法
      

  2.   

    呵呵,谢谢楼上的,我问这个问题的目的不是为了单纯解决缓存问题.
    主要是想知道springmodules和ehcache的集成问题.为什么,我这边集成不了....
      

  3.   

    你的配置没问题
    要是想要缓存起作用要加上这句template.setCacheQueries(true); //设置缓存
      

  4.   

    报得是这个异常:
    Exception in thread "main" java.lang.ClassCastException: $Proxy8
    估计是个低级AOP的错误吧。
    也搞不清楚了。
      

  5.   

    public List<Rant> getRantsForDay(Date day) {
            System.out.println("get result by method:getRantsForDay");
            HibernateTemplate template = getHibernateTemplate
            template.setCacheQueries(true);
            return template.find("from Rant r where r.postedDate = ?", day);
        }