繁体   English   中英

EhCache Spring优化

[英]EhCache Spring optimization

我正在使用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方法的整个列表。 还有其他更好的方法吗?

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

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

不,注释无法实现。 除了清除缓存之外,您无法对批注执行批量操作。

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

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

如果您有所有书籍的清单,那么需要什么缓存?

您可以返回列表中所有书籍的子集。 在这种情况下,参数可以是查询。 列表的大小应该受到限制,这样在处理和缓存它时不会耗尽内存。 理想情况下,您返回具有ID的List<Integer>或具有ID数组支持的List<Book>并从缓存中检索书籍对象。

如果您希望能够处理所有书籍,则使用Iterator<Integer> findAll()Iterator<Book> findAll()方法更为合适。 您不应该缓存它,因为:结果大小是无界的,只有在更频繁地访问一小部分数据时,缓存才有意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM