[英]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.