Java @日食缓存

Java @日食缓存,java,caching,eclipselink,Java,Caching,Eclipselink,我需要一个及时从数据库中获取对象的数据库。我决定不允许缓存我的实体。通过使用此配置: @Cache( type = CacheType.NONE/*, alwaysRefresh = true, disableHits = true, coordinationType = INVALIDATE_CHANGED_OBJECTS*/ ) 但我读到: 无 public static final CacheType NONE WARNIN

我需要一个及时从数据库中获取对象的数据库。我决定不允许缓存我的实体。通过使用此配置:

@Cache(
        type = CacheType.NONE/*,
        alwaysRefresh = true,
        disableHits = true,
        coordinationType = INVALIDATE_CHANGED_OBJECTS*/
)
但我读到:

public static final CacheType NONE
WARNING: Does not preserve object identity and does not cache objects.
这个警告很重要吗?我可以理解JVM可能会错误地将对象与其真实身份关联起来!
有没有关于不缓存对象的最佳配置的建议,例如使用alwaysRefresh

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

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

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


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

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

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

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


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

非常感谢。事实上,我的应用程序在局域网上被许多客户机使用。因此,我决定将type=CacheType设置为SOFT(不丢失标识),并将alwaysRefresh设置为true。如果您同意,只需对您的答案进行一些更新,使其成为正确的答案。我通常在JPA提供程序上对其进行全局配置,如果您使用的是persistence.xml,则可以不添加任何内容。通常我在只使用代码的方法中使用EclipseLink,因此它设置
jpapProperties.setProperty(org.eclipse.persistence.config.PersistenceUnitProperties.CACHE\u SHARED\u DEFAULT,“false”)
。将缓存设置为nono将导致实体的引用问题。这一个有一些像我所面临的随机问题:我在禁用共享(内部持久性上下文)缓存时从来没有遇到过任何问题,而且自从创建Eclipselink以来(在此之前我使用Toplink),我在每个项目中都使用过Eclipselink。大多数JPA问题都是因为开发人员不知道Entitymanager如何工作以及如何工作,而且在某些情况下它与持久性上下文不同。第一级缓存位于持久性上下文中,不是实体管理器,而是通过Entitymanager与持久性上下文交互。非常感谢。事实上,我的应用程序在局域网上被许多客户机使用。因此,我决定将type=CacheType设置为SOFT(不丢失标识),并将alwaysRefresh设置为true。如果您同意,只需对您的答案进行一些更新,使其成为正确的答案。我通常在JPA提供程序上对其进行全局配置,如果您使用的是persistence.xml,则可以不添加任何内容。通常我在只使用代码的方法中使用EclipseLink,因此它设置
jpapProperties.setProperty(org.eclipse.persistence.config.PersistenceUnitProperties.CACHE\u SHARED\u DEFAULT,“false”)
。将缓存设置为nono将导致实体的引用问题。这一个有一些像我所面临的随机问题:我在禁用共享(内部持久性上下文)缓存时从来没有遇到过任何问题,而且自从创建Eclipselink以来(在此之前我使用Toplink),我在每个项目中都使用过Eclipselink。大多数JPA问题都是因为开发人员不知道Entitymanager如何工作以及如何工作,而且在某些情况下它与持久性上下文不同。第一级缓存位于持久性上下文中,而不是实体管理器中,但是您可以通过Entitymanager与持久性上下文交互。