几天来,我一直在为这个问题撞墙。
我们正在尝试使用 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
{
...
}
我是否正确地做出了这些假设?如果没有,这里的方法是什么?我想我把这件事弄得一团糟。