2017-01-10 51 views
0

我想从数据库中及时获取对象。我决定不允许缓存我的实体。通过采用这种结构:@EclipseLink中的缓存

@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可能misrelate对象以自己的真实身份! 是否有任何建议没有缓存一个对象,如alwaysRefresh例如对象的最佳配置。

回答

1

如果您的程序是使用数据库的唯一应用程序,则不应禁用高速缓存,如果有多个客户端,则禁用高速缓存或重新配置高速缓存可能是正确的。

与任何缓存策略一样,权衡是在速度和陈旧数据之间进行权衡。大多数JPA实现在文本(PC可以是第一级缓存)之间共享(第二级)缓存,所以当使用em.find()加载实体时,不需要如果实例已被缓存,则访问数据库。如果另一个客户端有权访问数据库,那么如果数据库被修改,您最终可能会提供陈旧的数据。

如果您有一个集群JPA应用程序,并且该数据库只能由您的JPA应用程序访问,那么只要您配置缓存协调,仍然可以使用缓存。当使用缓存协调时,一个实例会通知其他实体是否已更新实体,因此其他实例可以更新其缓存或放弃缓存版本。

在我建立的解决方案中,我几乎总是必须禁用缓存,因为数据库有多个客户端,我们从不想显示过时的数据。

+0

非常感谢。实际上,我的应用程序被许多客户通过局域网使用。所以,我决定键入= CacheType为SOFT(不丢失身份)并且alwaysRefresh为true。如果您同意只是对您的答案进行一些更新以使其成为正确的答案 –

+0

我通常在JPA提供程序上全局配置它。如果您使用的是persistence.xml,则可以添加 NONE。通常我使用EclipseLink的代码方式,所以它设置'''jpaProperties.setProperty(org.eclipse.persistence.config.PersistenceUnitProperties.CACHE_SHARED_DEFAULT,“false”)'''。 –

+0

将缓存设置为nono将导致实体的引用问题。这一个有一些随机问题,像我面临的:http://stackoverflow.com/questions/20920400/jpa-2-eclipselink-caching-issue?lq=1 –

相关问题