gpt4 book ai didi

java - Grails/hibernate 缓存不可预测

转载 作者:行者123 更新时间:2023-12-02 16:00:16 24 4
gpt4 key购买 nike

当我真的尝试了所有方法后,我才求助于StackOverflow,但我只是想不出如何解决这个问题。复制非常容易,基本上我有一个表(基本上只是保存设置的键/值表)。

class SystemSetting {
Group settingGroup
String key
String value
String label
String type

Date lastUpdated
Date dateCreated
}

我有一个简单的 Controller ,可让我更新这些设置(@Transactional批注)并在保存时更新“flush:true”。

现在,可以说,一旦做出更改,我就将选项从true设置为false(或任何更改),它不会反射(reflect)在其他进程/ session 上。

读取设置的代码如下:
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。
  • Grails中的
  • 'run-app'并访问/ AsyncErrorTest / systemSetting
  • 创建一个选项,将optionName ='testOption'设置为true(或false)
  • 使用curl(或其他浏览器)访问/ AsyncErrorTest / systemSetting / showVariable几次,更改变量值,您将看到输出正确反射(reflect)了更改。
  • 再次更改“testOption”的值。
  • 使用curl几次调用/ AsyncErrorTest / systemSetting / showVariableAsync,您会注意到该变量将开始在当前值和上一个值之间更改其值。
  • 一旦注意到此行为,您就可以在浏览器中甚至是原始的showVariable方法中进行检入,它还会提供不可靠的输出。
  • 最佳答案

    这已报告给Grails问题,并已在Grails 2.5.2中修复。

    https://github.com/grails/grails-core/issues/9198

    关于java - Grails/hibernate 缓存不可预测,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32019903/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com