按标准获取实体时不使用类高速缓存

时间:2012-10-25 17:25:12

标签: nhibernate caching

我在nhibernate.cfg.xml文件中设置了class-cache。

当我通过Id获取我的实体时,一旦加载了对象,我就看不到SQL请求。

但是当我使用条件获取实体时,总会有SQL查询......

修改

我想这回答了我的问题:

http://www.javalobby.org/java/forums/t48846.html

  

假设我们想要根据更复杂的内容查找条目   查询比直接通过ID,例如按名称。在这种情况下,Hibernate   必须仍然发出一个SQL语句来获取。的基本数据集   查询。所以,例如,这段代码:

     

查询query = session.createQuery(“来自Person as p where   p.firstName =?“); query.setString(0,”John“); List l = query.list();   ...会调用一个选择(假设我们的关联是   高速缓存)。

     

select * from Person where firstName ='John'这个单选将会   然后返回'1',然后缓存将用于所有其他查找   因为我们已经缓存了所有内容。这个强制性单选是在哪里   查询缓存进来了。

1 个答案:

答案 0 :(得分:2)

不确定您的“编辑”是否表示您已找到所有答案。 NHibernate将缓存机制分为两个区域。

如上所述,First是“类”缓存。可以使用具有特定ID(Session.Get(id);,引用的属性,集合)的对象的任何请求。

第二个是“查询”缓存。在这种情况下,用于缓存的取决于传递的Criteria。那些用于获取结果集(where,order by,top ...)。在这种情况下缓存的是由该查询返回的一组ID。

所以稍后,当应用相同的标准时,将返回缓存的ID集,并重用来自类缓存(通过ID)的缓存实体。

(特定场景适用于投影,在最新的NHibernate版本中也可以缓存。在这种情况下,结果不包含具有唯一ID的实体,而是一组列。虽然不适合ID基于缓存,它也是有效的。版本3.3正在为我做这个)

所以,最后回答:

  

但是当我使用条件获取实体时,总会有SQL查询......

我们也必须允许查询缓存:

<property name="cache.use_second_level_cache">true</property>
<property name="cache.use_query_cache">true</property>

允许二级缓存,并且可以存储具有ID的对象。此外,还启用了对查询缓存的支持,因此同一条件组合的第二次调用根本不应该转到SQL服务器。

缓存查询示例:

criteria.SetCacheable(true)
    .SetCacheMode(CacheMode.Normal)
    .SetCacheRegion("LongTerm");