本人在看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>
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>
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) 你这个方法
或则你可以按我写的修改一下你的方法
主要是想知道springmodules和ehcache的集成问题.为什么,我这边集成不了....
要是想要缓存起作用要加上这句template.setCacheQueries(true); //设置缓存
Exception in thread "main" java.lang.ClassCastException: $Proxy8
估计是个低级AOP的错误吧。
也搞不清楚了。
System.out.println("get result by method:getRantsForDay");
HibernateTemplate template = getHibernateTemplate
template.setCacheQueries(true);
return template.find("from Rant r where r.postedDate = ?", day);
}