2013-04-26 42 views
0

例如來自:SpringSource春@Cachable更新數據

@Cacheable(value = "vets") 
public Collection<Vet> findVets() throws DataAccessException { 
    return vetRepository.findAll(); 
} 

如何findVets()工作到底是什麼?

這是第一次從vetRepository獲取數據並將結果保存在緩存中。但是如果在數據庫中插入新的獸醫會發生什麼情況 - 緩存更新(開箱即用)?如果沒有,我們可以配置它來更新嗎?


編輯:

但是,如果DB是從外部源(例如使用相同的DB的應用)更新會發生什麼?

回答

1
@CacheEvict("vets")  
public void save(Vet vet) {..} 

你必須告訴緩存的對象是陳舊的。如果數據在沒有使用服務方法的情況下發生變化,那麼當然,您會遇到問題。但是,您可以清除整個高速緩存,但可以使用

@CacheEvict(value = "vets", allEntries = true)  
public void clearCache() {..} 

雖然這取決於高速緩存提供程序。如果另一個應用在不通知應用的情況下更新數據庫,但它使用相同的緩存,則其他應用也可能會更新緩存。

+0

它們可以共享相同的緩存提供程序嗎? – 2013-04-26 12:46:51

+1

理論上:是的。但是,緩存作爲單獨的應用程序運行是必要的。 Spring的默認提供者只是一個簡單的地圖。 – zeroflagL 2013-04-26 12:56:47

0

它不會自動執行,並且緩存無法知道數據是否已從外部引入。

檢查@CacheEvict這將幫助您在高速緩存條目無效時對基礎集合進行任何更改。

@CacheEvict(value = "vet", allEntries = true) 
public void saveVet() { 
    // Intentionally blank 
} 

allEntries
無論緩存(S)內的所有條目被刪除與否。
默認情況下,僅關聯關鍵字下的值被刪除。請注意,指定將此參數設置爲true並指定密鑰是不允許的。

0

您也可以在創建新條目的方法上使用@CachePut。返回類型必須與@Cachable方法中的返回類型相同。

@CachePut(value = "vets") 
public Collection<Vet> updateVets() throws DataAccessException { 
    return vetRepository.findAll(); 
} 

在我看來一個exernal服務必須調用相同的方法。