Grails缓存重新启动



我正在使用Grails Cache插件来缓存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集合。查询运行后,您将值存储在弹簧管理的高速缓存中,然后将Web请求结束,则关闭了Hibernate会话,并断开了实例。后来访问任何非初始化的懒惰属性将触发您看到的异常,除非您将实例重新列为当前会话,例如使用merge()。但是如果您使用了第二级缓存,Hibernate将为您做到这一点。

第二级缓存也很容易簇。添加第二个Web服务器后,您需要确保没有2个独立的缓存,而是2个互相更新以保持同步的缓存。显然,这对于弹簧缓存是可行的,但是Hibernate/Gorm更为简单。

相关内容

最新更新