【发布时间】:2014-04-06 00:54:12
【问题描述】:
我们需要缓存一个查询的结果;查询返回数据库的整个表。问题是数据库被其他应用程序从外部更改;使用更改的行的确切主键通知进行查询的 Java 应用程序。
是否可以只替换查询缓存中已更改的元素,而不是整个列表? 这是一级缓存(来自 EntityManager)二级缓存(来自 EntityManagerFactory)还是不同的缓存?
如果可以的话,这可以从 JPA 完成吗?
entityManager.refersh(entity);
或者这个查询缓存是二级 JPA 缓存:
entityManagerFactory.getCache().evict(cls, primaryKey);
还是只能通过 Hibernate/EclipseLink API 实现?
如果不可能,为了实现这一点,对所有元素调用entityManager.find() 会这样做吗?
我在Hibernate documentation 和EclipseLink documentation 中都没有找到任何有用的东西。 Hibernate 支持区域和仅刷新区域,但我们需要实体级别的刷新粒度。
稍后编辑以澄清我的发现。
按照@Chris 在评论中发布的链接,我发现我想要的实际上是supported by EclipseLink,但仅适用于 Oracle 数据库(可以为其他供应商实现自己的处理程序;但来自数据库的调用不是标准化并且因供应商而异)。我还没有发现 Hibernate 是否支持这一点。
无论如何,与 Spring Cache(基于 CocurrentMap)或基于自定义的缓存相比,来自 EclipseLink 的查询缓存的性能非常差,因此将继续使用 Spring Cache 或 Spring Jdbc 上的自定义缓存。
【问题讨论】:
标签: java hibernate caching orm eclipselink