gpt4 book ai didi

java - 级联持久上的 Eclipselink 查询缓存失效

转载 作者:行者123 更新时间:2023-12-02 05:30:53 25 4
gpt4 key购买 nike

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

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

显然,命名查询的 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 文档。特别是对于“查询缓存自动失效”。

请就这个主题给我建议。

提前致谢。

最佳答案

要使用QueryResultsCachePolicy,您需要执行以下操作:

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

但是要使用查询缓存,您需要使用 session :

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{...}

持久性.xml

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

关于java - 级联持久上的 Eclipselink 查询缓存失效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25545571/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com