由于初始查询很昂贵,如果搜索条件没有随后的页面查看更改,我想缓存搜索结果.
我目前的方法如下:
def search(criteriaMap,offset,pagesize)
在groovy / grails中缓存搜索结果的最佳方法是什么?我如何使搜索结果失效?
注意,我看到有一个springcache插件,但我不确定这是否适用于分页结果.我也知道grails是用ehcache打包的,但我还没有看到我可以直接访问的API,我只看到它用于GORM的二级缓存.
更新:我参与了@ mfloryan的解决方案来解决这个问题.
我在searchService中创建了两个方法:
@Cacheable("searchCache")def searchResults(uID,trimmedParams)def trimParams(params)
(一个是缓存而另一个不是.)
我在searchController中的代码:
def trimmedParams = searchService.trimParams(params)def results = searchService.searchResults(trimmedParams)//Page resultsresults = HelperService.pageResults(results,params.offset,params.max)[results: results,searchParams : trimmedParams]
结果,我调用了搜索服务,其中包含一个不包含分页参数的修剪参数列表.可以返回缓存的搜索结果.
searchController负责分页.
注意:我没有缓存hibernate结果,因为我最终会在缓存中加倍数据.我只缓存了来自searchService.searchResults的组合结果(它访问了REST API和我的本地数据库)
解决方法 首先,如果你想缓存查询,那么也许使用Hibernate查询缓存是一个很好的开始(在映射中设置缓存:true并传递缓存:true到executequery)使用SpringCache plug-in将允许您缓存来自控制器的整个响应.您需要做的就是像这样装饰控制器:@Cacheable(“searchMethodCache”)或只装饰您想要缓存结果的单个方法.缓存将通过查询字符串保存响应,因此它应该适用于分页.
@CacheFlush注释允许设置何时清除缓存.
EH Cache本身在grails-app / conf / spring / resources.groovy中配置
– 更新 –
在你发表评论后,我开始怀疑你可能会想到一个稍微不同的解决方案.因此,有一个查询返回结果列表,然后分页并显示该列表.使用标准的Grails方法,Hibernate将为每个页面生成一个查询(从完整列表返回一个子集,从而为每个页面运行一次可能昂贵的查询).据推测,您希望查询运行一次 – 返回缓存的完整结果集,然后从中提供单个页面.如果是这种情况,据我所知,你必须手动从Hibernate缓存中分页结果或在其他地方缓存结果集(Session context?)
总结以上是内存溢出为你收集整理的groovy – 在grails中缓存数据全部内容,希望文章能够帮你解决groovy – 在grails中缓存数据所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)