我正在尝试禁用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:总结一下,我希望所有查询和查找调用都会刷新从数据库中获取的数据。
答案 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问题。想弄明白这个问题。