禁用 JPA 中的缓存(eclipselink)

2022-08-31 20:25:02

我想使用JPA(eclipselink)从我的数据库中获取数据。数据库被许多其他来源更改,因此,对于我执行的每个发现,我都希望返回数据库。我已经阅读了许多关于禁用缓存的帖子,但这似乎不起作用。有什么想法吗?

我正在尝试执行以下代码:

        EntityManagerFactory entityManagerFactory =  Persistence.createEntityManagerFactory("default");
        EntityManager em = entityManagerFactory.createEntityManager();

        MyLocation one = em.createNamedQuery("MyLocation.findMyLoc").getResultList().get(0);

        MyLocation two = em.createNamedQuery("MyLocation.findMyLoc").getResultList().get(0);    

        System.out.println(one==two);

一==二是真的,而我希望它是假的。

我尝试将以下每个/所有内容添加到我的持久性中.xml

<property name="eclipselink.cache.shared.default" value="false"/>
<property name="eclipselink.cache.size.default" value="0"/>
<property name="eclipselink.cache.type.default" value="None"/>

我还尝试将@Cache注释添加到实体本身:

@Cache(
  type=CacheType.NONE, // Cache nothing
  expiry=0,
  alwaysRefresh=true
)

我是不是误会了什么?


答案 1

此行为是正确的,否则,如果使用不同的值更改对象 1 和对象 2,则在保留它们时会遇到问题。正在发生的是加载对象二的调用更新了在第一次调用中加载的实体。它们必须指向同一对象,因为它们是同一对象。这可确保无法写入脏数据。

如果您在两次调用之间调用 em.clear(),则实体 1 应该会分离,您的支票将返回 false。然而,没有必要这样做,eclipse link实际上是将您的数据更新到最新的,我猜这是你想要的,因为它经常变化。

另外,如果您希望使用 JPA 更新此数据,则需要在实体上获取悲观锁,以便基础数据无法在数据库中更改。

您还需要禁用查询缓存,并且缓存选项只是从play中删除对象缓存而不是查询缓存,这就是您没有获得新结果的原因:

在代码中:

em.createNamedQuery("MyLocation.findMyLoc").setHint(QueryHints.CACHE_USAGE, CacheUsage.DoNotCheckCache).getResultList().get(0);

还是在持久性中.xml:

<property name="eclipselink.query-results-cache" value="false"/>

答案 2
final Query readQuery = this.entityManager.createQuery(selectQuery);
readQuery.setParameter(paramA, valueA);

// Update the JPA session cache with objects that the query returns.
// Hence the entity objects in the returned collection always updated.
readQuery.setHint(QueryHints.REFRESH, HintValues.TRUE);

entityList = readQuery.getResultList();

这对我有用。


推荐