两个(JSF + JPA + EclipseLink + MySQL)应用程序共享同一个数据库。一个应用程序运行调度任务,另一个应用程序为调度创建任务。第一个应用程序创建的任务由第二个应用程序中的查询收集,没有任何问题。第二个应用程序更新任务中的字段,但第二个应用程序所做的更改在JPQL查询时不会刷新。
我已经添加了QueryHints.CACHE_USAGE作为CacheUsage.DoNotCheckCache,但是,最新的更新不会反映在查询结果中。
代码如下所示。
如何从JPQL查询中获得对数据库的最新更新?
public List<T> findByJpql(String jpql, Map<String, Object> parameters, boolean withoutCache) {
TypedQuery<T> qry = getEntityManager().createQuery(jpql, entityClass);
Set s = parameters.entrySet();
Iterator it = s.iterator();
while (it.hasNext()) {
Map.Entry m = (Map.Entry) it.next();
String pPara = (String) m.getKey();
if (m.getValue() instanceof Date) {
Date pVal = (Date) m.getValue();
qry.setParameter(pPara, pVal, TemporalType.DATE);
} else {
Object pVal = (Object) m.getValue();
qry.setParameter(pPara, pVal);
}
}
if(withoutCache){
qry.setHint(QueryHints.CACHE_USAGE, CacheUsage.DoNotCheckCache);
}
return qry.getResultList();
}发布于 2020-08-10 23:06:37
CacheUsage设置会影响EclipseLink可以使用内存中的内容进行查询的内容,但不会影响它访问数据库以获取结果后发生的情况。
看起来你不想直接避开缓存,但我假设你应该刷新它,这样最新的更改就可以看到了。当涉及多个应用程序和缓存级别时,这是一种非常常见的情况,因此您可能需要考虑许多不同的解决方案,例如手动无效,或者即使两个应用程序都是基于JPA的,缓存协调(因此一个应用程序甚至可以向另一个应用程序发送无效)。或者,您可以使用"eclipselink.refresh"查询提示对特定查询进行控制,这将强制查询使用从数据库返回的内容重新加载缓存对象中的数据。请小心使用它,就像在本地EntityManager中使用一样,查询返回的任何修改的实体也将被刷新,更改将丢失
缓存的引用:
https://wiki.eclipse.org/EclipseLink/UserGuide/JPA/Basic_JPA_Development/Caching
https://www.eclipse.org/eclipselink/documentation/2.6/concepts/cache010.htm
发布于 2020-08-09 06:11:04
通过添加以下行,使实体不依赖于缓存。
@Cache(
type=CacheType.NONE, // Cache nothing
expiry=0,
alwaysRefresh=true
)https://stackoverflow.com/questions/63320481
复制相似问题