我有以下域名模型:
class Folder {
User user
Set files = []
static hasMany = [files: File]
static mapping = {
tablePerHierarchy false
files cascade: 'all-delete-orphan'
}
static constraints = {
}
}
我有一个请求返回特定文件夹的文件列表。有时,后续调用会产生不同的结果。数据库已更新且正确,因此服务似乎会获取缓存数据。
是否真的有某种缓存能够实现这一目标?我该如何解决?
答案 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'