【发布时间】:2015-11-08 06:58:33
【问题描述】:
当我真的尝试了所有方法但我无法弄清楚如何解决这个问题时,我才会求助于 StackOverflow。它很容易复制,基本上我有一个表(基本上只是一个我保存设置的键/值表)。
class SystemSetting {
Group settingGroup
String key
String value
String label
String type
Date lastUpdated
Date dateCreated
}
我有一个简单的控制器,它允许我在保存时更新这些设置(@Transactional 注释)和 'flush: true'。
现在,假设我将一个选项从真设置为假(或任何更改),一旦进行此更改,它就不会反映在其他进程/会话上。
读取设置的代码如下:
SystemSetting setting = SystemSetting.find("FROM SystemSetting ss WHERE ss.settingGroup = :group AND ss.key = :key",
[group: group, key: key]
);
例如,在浏览器中 A) 我更新了一个设置。在浏览器 B(或 curl)中,当我查看/访问此设置时,它仍然具有旧值。
我已禁用所有我知道的缓存:
hibernate {
cache.use_second_level_cache = false
cache.use_query_cache = false
cache.region.factory_class = 'org.hibernate.cache.ehcache.EhCacheRegionFactory' // Hibernate 4
singleSession = true // configure OSIV singleSession mode
flush.mode = 'manual' // OSIV session flush mode outside of transactional context
}
grails.hibernate.cache.queries = false
但这些结果仍然很容易重复。什么/为什么/在哪里缓存此选项以及如何使其无效?
这真的不会让我内心感到温暖,因为如果我不能确定哪些数据将从数据库中出来,它会产生大量问题:(
使用 Grails 2.5.1(并在 2.4.4 上测试,结果相同)。
更新:
我已经能够在一个新的应用程序中复制它。
可在此处申请:https://github.com/donald-jackson/grails-async-error-demo
复制:
- 克隆存储库并将数据源配置为使用本地 MySQL。
- 'run-app' 在 Grails 中并访问 /AsyncErrorTest/systemSetting
- 使用 optionName = 'testOption' 将值设置为 true(或 false)创建设置
- 使用 curl(或其他浏览器)访问 /AsyncErrorTest/systemSetting/showVariable 几次,更改变量值,您将看到输出正确反映了更改。
- 再次更改“testOption”的值。
- 使用 curl 调用 /AsyncErrorTest/systemSetting/showVariableAsync 几次,您会注意到变量将开始在当前值和上一个值之间更改其值。
- 一旦您注意到此行为,您可以在浏览器中检查,甚至可以在原始 showVariable 方法中进行检查,它也会给出不可靠的输出。
【问题讨论】:
-
“现在,假设我将一个选项从 true 设置为 false” - 你在谈论设置什么样的选项?
-
@JeffScottBrown SystemSetting 的一个实例。 'True'/'False' 只是一个例子,假设 systemSettingInstance 值属性是 'x' 然后从提到的控制器我调用 systemSettingInstance.setValue('y');和 systemSettingInstance.save(flush:true); - 在第二个浏览器/curl 中,该值仍将返回为“x”。
-
这里描述的行为对我来说没有意义。我明白你在说什么,只是不知道为什么会发生这种情况。如果您可以创建一个演示该问题的示例应用程序,我们可以看看。我会调查数据库是否正在接收更新,并调查稍后检索实例的查询是否真的进入数据库,而不是来自应该被禁用的缓存的实例,或者类似的东西。
-
@JeffScottBrown 我会看看能否在一个非常具体的案例中复制它并与您分享。感谢您的帮助
-
您如何测试更新?仅来自浏览器?鉴于这听起来像一个布尔值(真/假),我想排除这是一个表单提交问题。请注意,HTML 复选框仅在选中时提交。这是否也发生在文本字段中,或者例如从控制器硬编码?
标签: java hibernate grails caching