1


几天来,我一直在为这个问题撞墙。

我们正在尝试使用 Infinispan 实现 Hibernate 的二级缓存。该应用程序在 JBoss AS 6 上运行,并使用 JTA 事务。

在我们的 persistence.xml 中,我们有:

...
<!-- JTA configurations -->
<property name="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" />
<property name="current_session_context_class" value="jta" />

<!-- Infinispan configurations -->
<property name="hibernate.cache.use_second_level_cache" value="true" />
<property name="hibernate.cache.use_query_cache" value="true" />

<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.infinispan.InfinispanRegionFactory"/>
<property name="hibernate.cache.infinispan.cachemanager" value="java:CacheManager/entity"/>
...

如此处定义

据我们了解,这是我们执行以下操作所需的缓存类型:

用例一: 我们在包含参考数据的数据库中有记录。此数据不会在很长一段时间内更改(我们希望 :))。

我们希望缓存这些记录,因为它们可能会被大量查询。当用户查询这些数据时,不需要去数据库,因为它应该被缓存。

对于这种情况,缓存类型是查询缓存,还是实体缓存?由于查询总是相同的,我的理解是查询缓存,因为 que 查询应该总是返回相同的结果。

我的查询:

List<MyEntity> list = session.createCriteria(MyEntity.class)
        .add(Restrictions.eq("id", 1))
        .setCacheable(true)
        .list();

用例二: 用户从数据库中获取特定记录,他可能会更新它。我们希望将此实体(或实体列表)保存在用户的会话(登录会话)缓存中,因此如果他在客户端更新此实体,我们不需要在更新前进行选择。在这种情况下,由于我们正在保存特定的实体,所以它被认为是实体缓存,对吧?如果我们想存储

为此,我们正在使用:

@Cacheable (true)
@Cache(usage = CacheConcurrencyStrategy.TRANSACTIONAL)
public class MyEntity implements Serializable 
{
...
}

我是否正确地做出了这些假设?如果没有,这里的方法是什么?我想我把这件事弄得一团糟。

4

2 回答 2

1

第二级(实体)缓存是(使其更简单)基于 id 作为键的映射。因此,每次在其他实体中“引用”引用数据时,实体管理器首先检查它是否存在于缓存中,然后再进入数据库。

查询缓存是查询的结果(id)实体的缓存。然后基于 ids 它将检索相应的实体(最好从实体缓存中......),因此您需要将实体缓存在二级缓存中才能使用。

对于您的第一个用例,请参考数据:您应该将实体注释为可缓存并使用只读策略。实体管理器在加载时会将引用数据放入引用实体中,或者使用 find(clazz,id) 从二级缓存中取出引用数据。

案例 2 有点棘手。没有“会话”范围的缓存(如果您需要将中间结果绑定到用户会话,则需要通过 SFSB 或任何上层会话机制自行管理)。如果您使实体可缓存,它将为服务器上的每个用户缓存,实体管理器上下文与用户没有直接链接。

如果要防止在更新之前进行选择,则应通过扩展的持久性上下文防止实体达到非托管状态(以防止合并)。如果实体经常可以由多个用户更新,则缓存可能会降低性能,因为管理一致性所花费的时间比访问数据库所花费的时间要长。

如果您在那里遇到性能瓶颈,您应该首先查看相关的实体获取和传播注释,如果它们太大,您会发出请求或/并从数据库更新太多数据。

于 2012-07-31T16:21:39.690 回答
1

交叉发布到https://community.jboss.org/message/751275#751275 - 在那里查看我的答案。

于 2012-08-20T11:00:23.460 回答