java – 无法做二级缓存
发布时间:2020-12-15 04:51:37 所属栏目:Java 来源:网络整理
导读:在我的applicationcontext.xml中 bean id="annotatedsessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"property name="packagesToScan" value="testonly.package.model" /property name="hibernatePrope
在我的applicationcontext.xml中
<bean id="annotatedsessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> <property name="packagesToScan" value="testonly.package.model" /> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.Oracle9Dialect</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.format_sql">true</prop> <prop key="hibernate.use_sql_comments">true</prop> <prop key="hibernate.cglib.use_reflection_optimizer">true</prop> <prop key="hibernate.hbm2ddl.auto">update</prop> <prop key="hibernate.c3p0.min_size">5</prop> <prop key="hibernate.c3p0.max_size">20</prop> <prop key="hibernate.c3p0.timeout">1800</prop> <prop key="hibernate.c3p0.max_statements">50</prop> <prop key="hibernate.cache.provider_class"> org.hibernate.cache.EhCacheProvider </prop> <prop key="hibernate.cache.use_second_level_cache">true</prop> <prop key="hibernate.cache.use_query_cache">true</prop> </props> </property> <property name="dataSource"> <ref bean="dataSource" /> </property> 在我的实体中 @Entity @Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE) @Table(name = "TestPOJOCATEGORY") @NamedQueries({ @NamedQuery(name = "TestPOJOcategory.findAll",query = "SELECT h FROM TestPOJOcategory h"),@NamedQuery(name = "TestPOJOcategory.findById",query = "SELECT h FROM TestPOJOcategory h WHERE h.id = :id"),@NamedQuery(name = "TestPOJOcategory.findByCategoryname",query = "SELECT h FROM TestPOJOcategory h WHERE h.categoryname = :categoryname")}) public class TestPOJOcategory implements Serializable { 在我的道 public List<TestPOJOcategory> getAllCategory(final String keyword,final int nFirst,final int nPageSize,final String sortColumnId,final boolean bSortOrder) { List<TestPOJOcategory> result = (List<TestPOJOcategory>) getHibernateTemplate().execute(new HibernateCallback() { public Object doInHibernate(Session session) { Criteria crit = session.createCriteria(TestPOJOcategory.class,"TestPOJOcategory") .add(Restrictions.ilike("categoryname",keyword)) .addOrder(bSortOrder ? Order.asc(sortColumnId) : Order.desc(sortColumnId)) .setFirstResult(nFirst).setMaxResults(nPageSize); System.out.println("why still call from DB? suppose to call from cache"); return crit.list(); } }); return result; } echcache.xml <cache name="testonly.package.model.TestPOJOcategory" maxElementsInMemory="200" eternal="true" overflowToDisk="false" timeToIdleSeconds="300" timeToLiveSeconds="600" /> 每次我调用dao时,它仍会从DB调用.为什么? 解决方法
首先,无论是否访问二级缓存,都会执行System.out.println()语句,因为此类访问是在list()方法中进行的.
其次,Criteria – 很像Query – 不会自动使用二级缓存;您指定的配置属性仅允许使用它.您仍然需要通过调用 Criteria crit = ...; crit.setCacheable(true); return crit.list(); 另外,由于你正在使用HibernateTemplate,你可以正确使用它:-)并摆脱手动doInHibernate包装器: public List<TestPOJOcategory> getAllCategory(final String keyword,final boolean bSortOrder) { DetachedCriteria crit = DetachedCriteria.forClass(TestPOJOcategory.class); crit.add(Restrictions.ilike("categoryname",keyword)) .addOrder(bSortOrder ? Order.asc(sortColumnId) : Order.desc(sortColumnId)); getHibernateTemplate().setCacheQueries(true); // works on both queries and criteria return (List<TestPOJOcategory>) getHibernateTemplate() .findByCriteria(crit,nFirst,nPageSize); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |