2017-05-04 94 views
0

我有一個應用程序使用ehcache版本:2.9.0,我想不存儲QueryCache誰返回空值。停止Ehcache存儲空值

搜索,我發現這個鏈接: http://www.ehcache.org/documentation/2.8/recipes/cachenull.html

而要實現上述cachenull,發現這個IDEIA: https://gist.github.com/bivas/1196809

我實現了CacheEventListener刪除空對象的關鍵,就像在GitHub的鏈接,但不工作,因爲即使選擇結果爲null,element.getObjectValue()也不會爲NULL。

顯示實現QueryCache的內容:)

1 - 第一選擇,沒有發現pessoaID = 999,因此結果爲NULL

Element: [ 
key = sql: select pessoa0_.PESSOA as PESSOA1_14_, from schema.PESSOA pessoa0_ where pessoas0_.ID=?; parameters: ; named parameters: {pID=999}; 
transformer: [email protected], 
keyValue=[6119085270048768], 
version=1, 
hitCount=0, 
CreationTime = 1493917302268, 
LastAccessTime = 1493917302268 ] 

2) - 第二選擇,發現pessoaID = 1

Element: [ 
key = sql: select pessoa0_.PESSOA as PESSOA1_14_, from schema.PESSOA pessoa0_ where pessoas0_.ID=?; parameters: ; named parameters: {pID=999}; 
transformer: [email protected], 
keyValue=[6119085270048768, 1], 
version=1, 
hitCount=0, 
CreationTime = 1493917304047, 
LastAccessTime = 1493917304047 ] 

PS:注意'keyValue'。是的ArrayList(在調試鋸,因爲方法getObjectValue()的返回是一個對象),並具有恆定的數字:僅在第一選擇和第二選擇具有6119085270048768 6119085270048768和選擇迴歸:1

如何進行對象值的驗證?換句話說,如何禁用ehcache來存儲空值?

回答

0

這種方法由我開發,聽起來有點「代碼味道」,但工作。

@Override 
public void notifyElementPut(final Ehcache cache, final Element element) throws CacheException { 

    Map elementValue = (Map) element.getObjectValue(); 
    if(elementValue.size() <= 1){ 
     remove(element); 
    } 
} 
0

this article所述,第一個參數是一個單調遞增的時間戳值,用於比較查詢緩存結果與基礎表空間修改時的數據一致性。

空結果得到緩存,這不是一個真正的問題,因爲只要沒有人修改底層實體,就可以重用此查詢結果。

爲什麼要禁用被緩存的空結果?我認爲目前的做法是正確的,我不認爲有任何設置可以使空的結果不被緩存。

+0

弗拉德,還有anothers系統寫入我的數據庫,所以在某一時刻選擇無法找到任何東西(返回NULL),但經過一段時間旁邊的寄存器插入。如果不執行:evictQueryRegion(「my_region_query_cache」),select永遠不會返回正確的。 –

+0

在這種情況下,您需要使用到期時間 –

+0

這看起來不像過期時間。 –