使用多个入口点正确缓存注释的方法

时间:2018-03-08 15:13:10

标签: java spring caching

我开始使用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>

  1. 当我检索单个值时(在第一次尝试运行数据库之后),它将被检索为缓存
  2. 当我检索所有值时,我可以运行一次数据库然后继续返回缓存值
  3. 编辑单个值应至少使缓存无效
    • 使用属性键
    • 调用getApplicationProperty(字符串值)
    • 所有情况下的getApplicationProperties()
  4. 使用多值编辑方法编辑所有值必须使此实体的所有缓存无效,并至少返回一次使用数据库。
  5. 我试图注释@CacheResult(cacheName = VALUES_CACHE_NAME) getters和@CachePut(cacheName = VALUES_CACHE_NAME)两个setter。但是,运行应用程序会导致始终调用缓存,并且AJAX调用无法看到修改。

    我正在编写一套广泛的单元测试来复制案例,但我仍然无法理解我的注释应该如何设计。

    我的情景与琐碎的例子不同,因为:

    • 我们不只是谈论Book s的简单集合:实体被转换和处理
    • 缓存一次适用于整个实体集,另一次使用从数据库中获取的子集。

    在这种情况下我应该如何处理缓存?我不需要极端性能,如果Spring在编辑单个值后清除整个缓存,我也很高兴。否则,我需要回滚到普通高速缓存管理,失去@Cache注释的好处,防止事务执行。

0 个答案:

没有答案