禁用JPA EclipseLink 2.4缓存

Min*_*tis 4 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"/>
Run Code Online (Sandbox Code Playgroud)

帮助的唯一选择是:

typedQuery.setHint(QueryHints.REFRESH, HintValues.TRUE);
Run Code Online (Sandbox Code Playgroud)

但是,这不是我的选择,因为现在的应用程序所写的,我不希望搜索所有查询或em.find()方法,并把这种暗示英寸

编辑1:此处描述了类似的问题:http://eclipse.1072660.n5.nabble.com/Notifications-about-external-database-changes-td5389.html

EDIT2:总结我想,所有的查询,并找到调用将刷新从数据库中获取数据.

Jam*_*mes 5

<shared-cache-mode>NONE</shared-cache-mode>
or,
<property name="eclipselink.cache.shared.default" value="false"/>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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