[英]cannot do 2nd level cache
<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;
}
<cache name="testonly.package.model.TestPOJOcategory"
maxElementsInMemory="200"
eternal="true"
overflowToDisk="false"
timeToIdleSeconds="300"
timeToLiveSeconds="600"
/>
每次我调用dao时,它仍会从DB调用。 为什么?
首先,无论是否访问二级缓存,都会执行System.out.println()
语句,因为此类访问是在list()
方法中进行的。
其次,标准-很像查询- 不会自动使用2级高速缓存; 您指定的配置属性仅允许使用它。 您仍然需要通过调用setCacheable(true)
将每个Query / Criteria实例明确标记为可缓存:
Criteria crit = ...;
crit.setCacheable(true);
return crit.list();
另外,由于你正在使用HibernateTemplate
你可以正确使用它:-)并摆脱手动doInHibernate
包装器:
public List<TestPOJOcategory> getAllCategory(final String keyword, final int nFirst,
final int nPageSize,
final String sortColumnId,
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);
}
好吧,使用二级缓存并不意味着您可以根据任意HQL(或Criteria)查询在缓存中找到对象。 第二个缓存仅在通过其键访问对象或导航对象图时使用。
所以,在这里,你需要使用查询缓存 (是的,有3个缓存:第一级缓存,第二级缓存和查询缓存)。 这需要:
session.createQuery("query").setCacheable(true);
或者,在使用Criteria
:
session.createCriteria(...).add(...).setCacheable(true);
和hibernate属性设置(你有):
hibernate.cache.use_second_level_cache=true
hibernate.cache.use_query_cache=true
实际上,如果你想更好地理解Hibernate使用的各种缓存机制以及Hibernate完全缓存的内容(即“脱水”实体),我会热烈建议检查以下资源:
这两篇文章有点陈旧但仍然适用。 后者是最近的。 所有这些都是很好的读数IMO。
如果您想知道是否执行了SQL语句,请打开(或org.hibernate.SQL记录器)上的show_sql属性。
否则,Hibernate缓存主要是通过主键。 当需要刷新对象或遍历多对一关系时,这非常有用。 通过随机并发更新/插入/删除(可能会或可能不会影响结果集)保持任意查询的缓存结果集看起来非常复杂。 除非您遇到性能问题,否则我不建议缓存查询。
看起来您可能错过了在休眠级别配置缓存。 看起来您需要将以下内容添加到您的hibernate配置文件中以启用缓存。
<cache usage=”read-only” />
你也可以想看一下这个链接,它看起来还不错。 http://blog.dynatrace.com/2009/03/24/understanding-caching-in-hibernate-part-three-the-second-level-cache/
希望这有用!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.