禁用JPA EclipseLink 2.4缓存

时间:2012-11-29 11:30:48

标签: java caching jpa eclipselink

我正在尝试禁用EclipseLink 2.4缓存,因此如果其他应用程序在数据库中更改了数据,则在我的应用程序中刷新相同的数据,该应用程序使用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:总结一下,我希望所有查询和查找调用都会刷新从数据库中获取的数据。

3 个答案:

答案 0 :(得分: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。

答案 1 :(得分:1)

我想我有same issue。我只是试图通过persistence.xml缓存属性(共享缓存,eclipselink-cache ...)来清除所有缓存,但随机我得到了一个实体的旧实例,显然没有任何模式.....

没办法!

答案 2 :(得分:0)

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

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

在一个请求中通过JPA更改实体后,然后在下一个请求中获取实体,仍然会出现OptimisticLocking问题。想弄明白这个问题。