【问题标题】:Eclipselink Query Cache invalidation on cascaded persist级联持久化上的 Eclipselink 查询缓存失效
【发布时间】:2014-10-22 03:00:20
【问题描述】:

我对 EclipseLink (2.5.0) QueryCaching 有问题,或者更准确地说,如果将对象插入数据库,查询缓存会失效。 如果我缓存实体 A 的查询并直接插入或更新实体 A,我可以正常工作。

但是让我们假设有一个实体 B 引用 @OneToMany(mappedBy = " a", orphanRemoval = true, cascade = CascadeType.ALL) 来自 A. A 拥有一个简单的 List bs; 带有注释。 如果我将一个新的 B 对象添加到 A 上的集合 bs 中,然后将 A 与 entityManager.merge() 合并;正确插入 B ... SQL 被执行。 对同一事务中所有 B 的 Where “某物”的缓存(命名)查询的后续执行不会返回刚刚插入的对象。

显然,命名查询的 QueryCache 没有更新,因为 B 对象不是显式插入的,而是通过 A 的级联插入的。

我找到了http://www.eclipse.org/eclipselink/api/2.5/org/eclipse/persistence/queries/QueryResultsCachePolicy.html#setInvalidationClasses(java.util.Set) 但我不知道如何使用它。据我了解,我应该能够将 A.class 添加到命名查询的 InvalidationClasses 中。但是 entityManager.createNamedQuery() 不提供设置 QueryResultsCachePolicy 的方法。

遗憾的是,QueryCaches 上的 Eclipselink 文档已经过时,并且没有引用使用的 2.5.0 版。

顺便说一下,我使用persistence.xml 中的提示为所有命名查询启用查询缓存。我通过http://java-persistence-performance.blogspot.co.at/2013/06/cool-performance-features-of.html 找到了这个特性,而且似乎没有官方的 Eclipselink 文档。尤其不是“查询缓存的自动失效”。

请就这个话题给我建议。

提前致谢。

【问题讨论】:

    标签: java caching jpa eclipselink


    【解决方案1】:

    要使用 QueryResultsCachePolicy,您需要这样做:

    ((ReadObjectQuery)((JpaQuery) query).getDatabaseQuery()).setQueryResultsCachePolicy(...);
    

    但是要使用查询缓存,你需要使用会话:

    JpaHelper.getDatabaseSession(getEntityManager().getEntityManagerFactory()).executeQuery(queryName);
    

    Using Queries and the Cache

    编辑:使用 eclipselink.query-results-cache,你需要使用 @Cache 来激活缓存 L2 并编辑你的 persistence.xml

    例子:

    @Entity
    @Cache(isolation=CacheIsolationType.SHARED)
    public class A{...}
    

    persistence.xml

    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
    

    【讨论】:

      猜你喜欢
      • 2011-03-12
      • 2014-11-22
      • 2013-10-03
      • 2013-10-18
      • 1970-01-01
      • 2023-04-03
      • 2013-05-15
      • 1970-01-01
      • 2010-09-14
      相关资源
      最近更新 更多