4

我正在尝试禁用 EclipseLink 2.4 缓存,因此如果数据在 DB 中被其他应用程序更改,相同的数据会在我使用 EclipseLink 2.4 的应用程序中刷新,而无需重新启动它。这些属性似乎都不起作用:

<shared-cache-mode>NONE</shared-cache-mode>
...
<property name="eclipselink.cache.shared.default" value="false"/>
<property name="eclipselink.cache.size.default" value="0"/>
<property name="eclipselink.cache.type.default" value="NONE"/>
<property name="eclipselink.query-results-cache" value="false"/>
<property name="eclipselink.refresh" value="true"/>

唯一有帮助的选择是:

typedQuery.setHint(QueryHints.REFRESH, HintValues.TRUE);

但这对我来说不是一个选择,因为现在编写了该应用程序,我不想搜索所有查询或em.find()方法并将此提示放入。

EDIT1:这里描述了类似的问题:http: //eclipse.1072660.n5.nabble.com/Notifications-about-external-database-changes-td5389.html

EDIT2:总而言之,我希望所有查询和查找调用都会刷新从数据库中获取的数据。

4

3 回答 3

5
<shared-cache-mode>NONE</shared-cache-mode>
or,
<property name="eclipselink.cache.shared.default" value="false"/>

是正确的机制。或者对特定类使用 @Cache 注释。

我假设您的问题是您对两个查询都使用相同的 EntityManager。EntityManager 还需要维护它管理的所有实例的缓存。总是刷新这些对象会导致您的应用程序所做的任何更改都被丢弃。(EntityManager 是一个事务对象)。

您应该为每个请求或每个事务创建一个新的 EntityManager,或者调用 clear() 以丢弃其托管对象。

EclipseLink 还支持 WEAK EntityManagers,但正确的设计是没有长期存在的 EntityManagers。

于 2012-11-29T14:47:27.970 回答
1

我想我有同样的问题。我只是想通过persistence.xml缓存属性(shared-cache,eclipselink-cache ...)清除所有缓存,但随机我得到一个实体的旧实例,显然没有任何模式.....

没门!

于 2014-01-05T19:23:34.330 回答
0

我为每个请求创建新的 EntityManager,

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

在一个请求中通过 JPA 更改实体后,然后在下一个请求中获取实体,仍然会出现 OptimisticLocking 问题。尝试找出问题所在。

于 2014-06-27T18:06:18.450 回答