【问题标题】:EhCache Spring optimizationEhCache Spring 优化
【发布时间】:2016-10-29 17:02:09
【问题描述】:

我正在使用 EhCache(2.10.1) 和 Spring (4.2.5)

我用这样的缓存配置了我的 BookDao 的方法:

@Cacheable(value = "bookByName", key = "#name")
public Book findByName(String name) {
    //find book by name in db 
}

@Cacheable(value = "bookById", key = "#id")
public Book findById(int id) {
    //find book by id in db
}

@Cacheable(value = "books", key = "??")
public List<Book> findAll() {
    //find books in db
}

首先,是否可以将findAll 缓存与findById 缓存或findByName 缓存结合使用?我应该在key annotation parameter 中输入什么?

其次,如果我想更新或创建一本书,我需要在每个缓存上添加/逐出这本书,并逐出 findAll 方法的整个列表。还有其他方法可以更好地做到这一点吗?

【问题讨论】:

    标签: java spring caching ehcache


    【解决方案1】:

    在概念层面上回答。对于任何缓存以及 Spring 缓存注解或 JSR107 缓存注解,这基本上是相同的问题。

    首先,是否可以将findAll 缓存与findById 缓存或findByName 缓存结合使用?我应该在关键注释参数中添加什么?

    不,这在注释中是不可能的。除了清除缓存之外,您不能对注解进行批量操作。

    一种可能性是使用命令式缓存接口检索缓存中的所有条目,但是,这只是缓存中的书籍,而不是所有可用的书籍。缓存并不知道所有可用的书,至少如果它真的是缓存的话。

    其次,如果我想更新或创建一本书,我需要在每个缓存上添加/逐出这本书,并逐出 findAll 方法的整个列表。还有其他更好的方法吗?

    如果你有一个所有书籍的列表,你需要缓存做什么?

    您可以返回列表中所有书籍的子集。在这种情况下,参数可以是查询。列表大小应该受到限制,因此在处理和缓存它时不会耗尽内存。理想情况下你会回来 List&lt;Integer&gt; 带有 id 或 List&lt;Book&gt; 以 id 数组为后盾,并从缓存中检索图书对象。

    如果您希望能够处理所有书籍,那么Iterator&lt;Integer&gt; findAll()Iterator&lt;Book&gt; findAll() 方法会更合适。你不应该缓存它,因为:结果大小是无限的,缓存只有在小部分数据被更频繁地访问时才有意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-05-29
      • 2017-06-25
      • 2017-07-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-04
      • 2012-10-16
      相关资源
      最近更新 更多