我只是訴諸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
要複製:
- 克隆庫和配置爲使用本地的MySQL數據源。 Grails中
- '運行應用程序',並參觀/ AsyncErrorTest/systemSetting
- 創建OPTIONNAME = 'testOption' 設定值設置爲true(或false)
- 使用curl(或其他瀏覽器)訪問/ AsyncErrorTest/systemSetting/showVariable幾次,更改變量值,您將看到輸出正確地反映了更改。
- 再次更改'testOption'的值。
- 使用curl調用/ AsyncErrorTest/systemSetting/showVariableAsync幾次,您會注意到變量將開始在當前和之前的值之間更改它的值。
- 一旦你注意到這種行爲,你可以檢查你的瀏覽器,甚至在原始的showVariable方法,它也會給出不可靠的輸出。
「現在,可以說我設置爲從真亦假選項」 - 你說的是設置什麼樣的選擇呢? –
@JeffScottBrown一個SystemSetting的實例。 'True'/'False'只是一個例子,可以說systemSettingInstance的value屬性是'x',然後從上面提到的控制器中調用systemSettingInstance.setValue('y');和systemSettingInstance.save(flush:true); - 在第二個瀏覽器/ curl中,該值仍將返回爲'x'。 –
這裏描述的行爲對我來說沒有意義。我明白你在說什麼,只是不知道爲什麼會發生。如果你可以創建一個示例應用程序來演示這個問題,我們可以看看。我會調查數據庫是否正在接收更新,並調查稍後檢索實例的查詢是否真的要去db,而不是來自應該被禁用的緩存的實例,或者沿着這些線的東西。 –