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