繁体   English   中英

Grails缓存重新启动

[英]Grails Cache Restart

我正在使用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会话关闭,实例断开连接。 以后访问任何未初始化的惰性属性将触发您所看到的异常,除非您将该实例重新附加到当前会话,例如使用merge() 但是如果您使用2级缓存,Hibernate会为您完成此操作。

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

暂无
暂无

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

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