我想从数据库中及时获取对象。我决定不允许缓存我的实体。使用此配置:
@Cache(
type = CacheType.NONE/*,
alwaysRefresh = true,
disableHits = true,
coordinationType = INVALIDATE_CHANGED_OBJECTS*/
)
但我已阅读the documentation here:
NONE
public static final CacheType NONE
WARNING: Does not preserve object identity and does not cache objects.
这个警告是否重要,我可能会理解JVM可能会将对象误解为真实身份! 是否有任何关于不使用 alwaysRefresh 来缓存对象的最佳配置的建议。
答案 0 :(得分:2)
如果您的程序是唯一使用数据库的应用程序,则不应禁用缓存,如果有多个客户端,则禁用缓存或重新配置缓存可能是正确的。
与任何缓存策略一样,权衡速度和陈旧数据之间的权衡。大多数JPA实现在 P ersistence C ontexts之间共享(第二级)缓存(PC可以是一级缓存),因此当您使用加载实体时em.find()如果实例已经被缓存,则无需访问数据库。如果另一个客户端有权访问数据库,则在修改数据库时,最终可能会提供过时的数据。
如果您拥有群集JPA应用程序,并且数据库仅由JPA应用程序访问,则只要配置缓存协调,您仍可以使用缓存。使用缓存协调时,如果实体已更新,则一个实例将通知其他实例,以便其他实例可以更新其缓存,或丢弃其缓存版本。
在我构建的解决方案中,我几乎总是必须禁用缓存,因为数据库有多个客户端,我们从不想显示过时的数据。