繁体   English   中英

Grails /休眠缓存不可预测

[英]Grails/Hibernate Cache unpredictable

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

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

    Date lastUpdated
    Date dateCreated
}

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

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

读取设置的代码如下:

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

复制:

  1. 克隆存储库并配置数据源以使用本地MySQL。
  2. 在Grails中运行“应用程序”并访问/ AsyncErrorTest / systemSetting
  3. 使用optionName ='testOption'将设置值设置为true(或false)来创建设置
  4. 使用curl(或其他浏览器)几次访问/ AsyncErrorTest / systemSetting / showVariable,更改变量值,您将看到输出正确反映了更改。
  5. 再次更改“ testOption”的值。
  6. 使用curl多次调用/ AsyncErrorTest / systemSetting / showVariableAsync,您会注意到该变量将开始在当前值和上一个值之间更改其值。
  7. 注意到此行为后,您可以在浏览器中甚至是原始的showVariable方法中进行检入,它还会提供不可靠的输出。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM