Grails - 服务获取旧域数据

时间:2014-11-14 00:28:45

标签: grails groovy

我有以下域名模型:

class Folder {
    User user

    Set files = []
    static hasMany = [files: File]

    static mapping = {
        tablePerHierarchy false
        files cascade: 'all-delete-orphan'
    }

    static constraints = {
    }
}

我有一个请求返回特定文件夹的文件列表。有时,后续调用会产生不同的结果。数据库已更新且正确,因此服务似乎会获取缓存数据。

是否真的有某种缓存能够实现这一目标?我该如何解决?

2 个答案:

答案 0 :(得分:1)

在没有更多细节的情况下回答你的问题有点困难,但我可以给你几个常见的原因:

  • 如果使用Folder.get(id)进行查询,则查询绑定到 从第二级缓存(而不是db)中选择对象(如果有) 在缓存中。如果是这种情况,你应该使用动态查找器, 即,

     Folder.findById(id)
    

    这将始终从db中获取新对象。

  • 保存文件夹对象时,您可以考虑刷新 通过在save方法中传递选项flush:true来执行hibernate会话:

       folder.save(flush: true)
    

答案 1 :(得分:0)

这不是一个问题,而是一个答案,但我没有50个评论的声誉,所以我会在这里发布。我为违反礼仪而道歉。

在某些hibernate缓存选项中查看DataSource.groovy,您对这些值有什么看法?

cache.use_second_level_cache
cache.use_query_cache

第一个的默认值为true,第二个的默认值为false。如果启用了查询缓存,则可能无意中缓存了无限期持久的值。

此外,您正在执行的返回缓存结果的查询是什么?

结果显示缓存多长时间?几分钟,几小时,直到重启?当我有默认设置(使用MySQL)时,我遇到了结果似乎缓存30-60秒的情况。

最后(哇),你总是可以尝试打开Config.groovy中的SQL日志记录,看看是否真的在进行数据库查询。这将提供查询以及绑定变量。

debug 'org.hibernate.SQL'
trace 'org.hibernate.type.descriptor.sql.BasicBinder'