2015-08-14 85 views
0

我只是訴諸StackOverflow,當我真的嘗試了一切,但我無法弄清楚如何解決這個問題。這很容易複製,基本上我有一個表(基本上只是一個鍵/值表,我保持設置)。Grails /休眠緩存不可預知

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

    Date lastUpdated 
    Date dateCreated 
} 

我有一個簡單的控制器,讓我更新這些設置(@Transactional註釋)和「刷新:真正的」上保存。

現在,讓我們說,一旦做出這樣的改變,我就設置了一個從真到假(或任何改變)的選項,它不會反映在其他進程/會話中。

讀取設置的代碼如下:

SystemSetting setting = SystemSetting.find("FROM SystemSetting ss WHERE ss.settingGroup = :group AND ss.key = :key", 
      [group: group, key: key] 
     ); 

因此,例如,在瀏覽器A)我更新的設定。在瀏覽器B(​​或捲曲)中,當我查看/訪問此設置時,它仍然具有舊值。

我已經停用所有的緩存我所知道的:

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,相同的結果)測試

UPDATE:。

我已經能夠在一個新的應用程序複製此

應用程序可以在這裏找到:https://github.com/donald-jackson/grails-async-error-demo

要複製:

  1. 克隆庫和配置爲使用本地的MySQL數據源。 Grails中
  2. '運行應用程序',並參觀/ AsyncErrorTest/systemSetting
  3. 創建OPTIONNAME = 'testOption' 設定值設置爲true(或false)
  4. 使用curl(或其他瀏覽器)訪問/ AsyncErrorTest/systemSetting/showVariable幾次,更改變量值,您將看到輸出正確地反映了更改。
  5. 再次更改'testOption'的值。
  6. 使用curl調用/ AsyncErrorTest/systemSetting/showVariableAsync幾次,您會注意到變量將開始在當前和之前的值之間更改它的值。
  7. 一旦你注意到這種行爲,你可以檢查你的瀏覽器,甚至在原始的showVariable方法,它也會給出不可靠的輸出。
+0

「現在,可以說我設置爲從真亦假選項」 - 你說的是設置什麼樣的選擇呢? –

+0

@JeffScottBrown一個SystemSetting的實例。 'True'/'False'只是一個例子,可以說systemSettingInstance的value屬性是'x',然後從上面提到的控制器中調用systemSettingInstance.setValue('y');和systemSettingInstance.save(flush:true); - 在第二個瀏覽器/ curl中,該值仍將返回爲'x'。 –

+0

這裏描述的行爲對我來說沒有意義。我明白你在說什麼,只是不知道爲什麼會發生。如果你可以創建一個示例應用程序來演示這個問題,我們可以看看。我會調查數據庫是否正在接收更新,並調查稍後檢索實例的查詢是否真的要去db,而不是來自應該被禁用的緩存的實例,或者沿着這些線的東西。 –

回答