0

我正在尝试将缓存与 EclipseLink 一起使用。我在我的 persistence.xml 中启用了 shared-cache-mode = ENABLE_SELECTIVE ,所以当我使用 @Cacheable(true) 时,实体会被缓存。现在我想让它在版本过时并且实体被刷新时工作。

我已经设置了一个乐观锁定字段

@Version
@Column(name="optLock")
private int versionNum ;

当我尝试保存具有旧版本号的实体时,这是有效的,然后数据库会出现异常。

所以当我添加注释以启用缓存和刷新时

@Cacheable(true)
@Cache(size = 500, alwaysRefresh = true, refreshOnlyIfNewer = true)

实体不会被缓存。我启用了 eclipselink.profiler,我可以看到没有为这个实体制作缓存并且缺少 Counter:CacheHits 和 Counter:CacheMisses 日志。

当我删除

@Cache(size = 500, alwaysRefresh = true, refreshOnlyIfNewer = true)

该实体再次被缓存,但直接在数据库中完成的任何更改(并增加 optLock 字段)都不会通过。

什么我忘了她?或者我应该考虑什么才能让它工作?我一直在阅读的文档似乎应该可以正常工作。

4

1 回答 1

2

@Cache 覆盖@Cacheable,因此因为您没有在@Cache 中启用缓存,所以它获得了不缓存的持久性单元默认值。

添加,

@Cache(isolation=SHARED, ...)

到您的注释。

还请记录一个错误,EclipseLink 应该足够聪明,可以看到@Cacheable 并将其用作默认值,因为@Cache 中没有隔离设置,或者至少报告一个警告。

于 2012-12-06T14:55:11.907 回答