caching - Grails缓存重新启动

标签 caching grails

我正在使用grails缓存插件来缓存gorm对象的集合。此方法在服务中

@Cacheable('allBooks')
List<Book> getAllFictionBooks() {
    log.info("Looking up all books and adding them to a cache")
    Book.findAllByIsFiction(true)
}

但是,在服务器重新启动时,我收到此错误,并且经常不得不第二次重新启动服务器
failed to lazily initialize a collection of role: com.Book.applyTo, no session or session was closed

我加了
grails.cache.clearAtStartup = true

到Config.groovy,但这似乎没有帮助。我可能正在做一些愚蠢的事情。任何帮助深表感谢。

我正在使用Grails 2.2.1。插件:缓存:1.1.1

最佳答案

您不想使用缓存插件来缓存GORM查询结果-Hibernate已经在查询缓存中对此提供了支持。而且它更加健壮,尤其是在失效方面。例如,如果您的查询返回了4本书,但是在将来的某个时候添加了新的小说,则您需要手动删除此结果。但是Hibernate已经做到了-任何新的,删除的甚至是修改过的书都将导致与书一起删除所有缓存的结果。

但是,您看到的问题是,显然您有一个延迟加载的applyTo集合。查询运行后,您将值存储在Spring托管的缓存中,然后Web请求结束,Hibernate Session关闭,实例断开连接。稍后访问任何未初始化的惰性属性将触发您所看到的异常,除非您将该实例重新附加到当前 session ,例如与merge()。但是,如果您使用2级缓存,则Hibernate会为您完成此操作。

2级缓存也很容易集群。添加第二台Web服务器后,需要确保您没有2个独立的缓存,而是2个互相更新以保持同步的缓存。这显然可以通过Spring缓存来实现,但是使用Hibernate / GORM则更加简单。

关于caching - Grails缓存重新启动,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21336870/

相关文章:

c# - 需要中层帮助

java - 在两台服务器之间同步缓存数据的最佳方式

amazon-web-services - 部署后如何处理云端缓存

grails - 如何使用 Grails 2.0 where 查询进行投影?

Spring Boot 1.3 + OAuth : Authentication request failed: BadCredentialsException: Could not obtain access token

ajax - 在发布请求中以字符串形式发送文件会停止解析参数

java - 如果之前进行过搜索,则带有缓存的搜索建议 (Java)

grails - 在Grails中将Cookie httpOnly设置为false。

grails - 发送数据到父 Controller 类中查看

image - 我的Windows 10企业版无法在minikube中加载缓存的图像