我开始使用JSR 107 / Spring缓存注释。我现在更喜欢JSR注释而不是Spring特定的,因为它们是标准的 -ish。
我有一个查找实体,我可以用不同的方式查询和修改。这个概念是我想要缓存数据库上的数据,至少在有人进行任何更改之前。 “任何”对我都有好处。
让我简化一下这个概念:我有一个名为ApplicationProperty
的实体很少(如果不是永远)改变,我想将它缓存在它的管理器中。以下是简化版
@Entity
public class ApplicationProperty {
@Id
private String key;
@Column
private String valueSerialized;
@Column
private Class<?> type;
}
ApplicationPropertyManager
完全照顾(反)序列化和验证,我已编写并测试它以进行数据库调用。工作良好。让我们看看我现在可以使用的方法,但在此之前请考虑我基本上允许前端查看/编辑所有属性或开发人员使用我的代码来读取/编辑单个属性。
另外,为了欢乐
public interface ApplicationPropertyManager {
/**
* Key is the property's ID, value is automagically deserialized
* Preferred way to display all properties to front end screen via AJAX
*/
Map<String, ? extends Serializable> getApplicationPropertyValues();
/**
* Preferred way to get a property programmatically. It is automagically casted by code
*/
<T extends Serializable> T getApplicationProperty(String propertyId);
/**
* Preferred way to set a property programmatically. Username is for audit and is irrelevant to caching
*/
void setApplicationProperty(String propertyId, Serializable value, String username);
/**
* Front end sets all properties at once in a single transaction. Username is for audit and is irrelevant to caching
*/
void setApplicationProperties(Map<String, ? extends Serializable> properties, String username);
}
说到这里,我在理解中失败了如何在non-trivial cases中使用Spring中的缓存注释。我的目标是缓存的行为只是本地Map<String,Serializable>
。
我试图注释@CacheResult(cacheName = VALUES_CACHE_NAME)
getters和@CachePut(cacheName = VALUES_CACHE_NAME)
两个setter。但是,运行应用程序会导致始终调用缓存,并且AJAX调用无法看到修改。
我正在编写一套广泛的单元测试来复制案例,但我仍然无法理解我的注释应该如何设计。
我的情景与琐碎的例子不同,因为:
Book
s的简单集合:实体被转换和处理在这种情况下我应该如何处理缓存?我不需要极端性能,如果Spring在编辑单个值后清除整个缓存,我也很高兴。否则,我需要回滚到普通高速缓存管理,失去@Cache
注释的好处,防止事务执行。