這個問題是關係到我的其他question休眠只讀查詢緩存機制
我建立一個Spring Web應用程序,其使用Hibernate從數據庫中讀取數據。我的應用程序不會知道對數據庫所做的任何更改(更新/插入)。有沒有辦法在這種情況下使用查詢緩存?
我配置了查詢緩存,並且當我從不同的App更新數據庫時,它不會使緩存無效。而我認爲這是預期的行爲。
當數據庫中有更新時,我需要緩存和無效的查詢。如何實現這一目標?
這個問題是關係到我的其他question休眠只讀查詢緩存機制
我建立一個Spring Web應用程序,其使用Hibernate從數據庫中讀取數據。我的應用程序不會知道對數據庫所做的任何更改(更新/插入)。有沒有辦法在這種情況下使用查詢緩存?
我配置了查詢緩存,並且當我從不同的App更新數據庫時,它不會使緩存無效。而我認爲這是預期的行爲。
當數據庫中有更新時,我需要緩存和無效的查詢。如何實現這一目標?
我不確定是否有任何自動刷新緩存的方式。但是我在上一個項目中解決了這個問題。公開下面的方法並授予管理員權限。一旦在數據庫中進行了任何修改,就會從外部調用此方法來刷新緩存。
public void refreshCache()
{
try {
Map<String, ClassMetadata> classesMetadata = sessionFactory.getAllClassMetadata();
for (String entityName : classesMetadata.keySet()) {
sessionFactory.evictEntity(entityName);
}
} catch (Exception e) {
e.printStackTrace();
}
}
謝謝。這正是我現在計劃要做的。我的查詢不是基於實體的,因此我正在驅逐所有查詢區域。不過,如果有其他方法可以自動執行此操作,而無需維護開銷,我會很樂意實現。 – dj8485
那麼,如果你使用的是Oracle,下面的命令會給你上次更新獨特的SCN在桌子上
select max(ora_rowscn) from TableName;
輸出
10772982279880
進一步您將它轉換爲時間戳,如果你想
select scn_to_timestamp(10772982279880) from dual
但idont認爲你需要將其轉換爲時間,只需緩存rowscn並定期檢查表,如果有變化,你可以驅逐緩存區域。
Please note that this supports version > 10g
我正在使用MySQL。 – dj8485
您可以嘗試查看集羣緩存的Terracotta,SwarmCache,TreeCache等複製等。 –
@NayanWadekar:謝謝。將調查他們 – dj8485