groovy - 在 grails 中缓存数据

标签 groovy ehcache grails-plugin grails

我有一个网站,用户将首先输入他们的搜索条件。搜索结合了来自 2 个来源的数据,其中之一不是数据库。搜索结果通常足够大,可以分页。

由于初始查询的开销很大,如果后续页面浏览的搜索条件没有改变,我想缓存搜索结果。

我目前的方法看起来像:

def search(criteriaMap, offset, pagesize)

在 groovy/grails 中缓存搜索结果的最佳方法是什么?我将如何使搜索结果过期?

请注意,我看到有一个 springcache 插件,但我不确定这是否适用于分页结果。我也知道 grails 与 ehcache 一起打包,但我还没有看到我可以直接访问的 API,我只看到它用于 GORM 的二级缓存。

更新 :我参与了@mfloryan 的解决方案来解决这个问题。

我在 中创建了两个方法搜索服务 :
@Cacheable("searchCache")
def searchResults(uid, trimmedParams)
def trimParams(params)

(一个被缓存,另一个没有。)

我在 中的代码搜索 Controller :
def trimmedParams = searchService.trimParams(params)
def results = searchService.searchResults(trimmedParams)

//Page results
results = HelperService.pageResults(results, params.offset, params.max)

[results: results, searchParams : trimmedParams]

结果,我使用不包含分页参数的修剪过的参数列表调用了搜索服务。可以返回缓存的搜索结果。

searchController 负责分页。

备注 :我没有缓存休眠结果,因为我最终会得到双倍缓存中的数据。我只缓存了来自 searchService.searchResults 的组合结果(它访问了 REST API 和我的本地数据库)

最佳答案

首先,如果您想缓存查询,那么使用 Hibernate 查询缓存也许是一个好的开始(在 cache:true 中设置 mappings 并将 cache: true 传递给 executeQuery )

使用 SpringCache plug-in将允许您缓存来自 Controller 的整个响应。您需要做的就是像这样装饰 Controller :@Cacheable("searchMethodCache")或者只装饰你想要缓存结果的单个方法。缓存将通过查询字符串保存响应,因此它应该适用于分页。@CacheFlush注释允许设置何时应清除缓存。

EH 缓存本身在 grails-app/conf/spring/resources.groovy 中配置

- 更新 -

在您发表评论之后,我开始怀疑您可能正在考虑稍微不同的解决方案。所以有一个查询返回结果列表,然后该列表被分页并显示。使用标准的 Grails 方法,Hibernate 将为每个页面生成一个查询(从完整列表中返回一个子集,从而为每个页面运行一次可能昂贵的查询)。大概您希望查询运行一次 - 返回缓存的完整结果集,然后从中提供单个页面。
如果是这种情况,据我所知,您将不得不从 Hibernate 缓存手动分页结果或将结果集缓存在其他地方( session 上下文?)

关于groovy - 在 grails 中缓存数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4164869/

相关文章:

java - 扩展一个扩展另一个抽象类的抽象类时的构造函数问题

mysql - Grails 域约束映射

gradle - Gradle 中 "def"和 "static def"之间的区别

scala - AKKA:通过消息队列进行通信

multithreading - Grails 1.3.7- Multi-Tenancy 插件和多线程操作-线程无法访问租户

docker - docker中的Grails应用程序,安装spring-security插件?

grails - 加密 Grails Config 和 DataSource 文件中的一些文本

hibernate - 创建子项目后,缓存关联不会更新

需要Java缓存解决方案

java - Hibernate - maxElementsOnDisk 从 EHCache 到 TreeCache