2013-02-08 103 views
1

這個問題是關係到我的其他question休眠只讀查詢緩存機制

我建立一個Spring Web應用程序,其使用Hibernate從數據庫中讀取數據。我的應用程序不會知道對數據庫所做的任何更改(更新/插入)。有沒有辦法在這種情況下使用查詢緩存?

我配置了查詢緩存,並且當我從不同的App更新數據庫時,它不會使緩存無效。而我認爲這是預期的行爲。

當數據庫中有更新時,我需要緩存和無效的查詢。如何實現這一目標?

+0

您可以嘗試查看集羣緩存的Terracotta,SwarmCache,TreeCache等複製等。 –

+0

@NayanWadekar:謝謝。將調查他們 – dj8485

回答

1

我不確定是否有任何自動刷新緩存的方式。但是我在上一個項目中解決了這個問題。公開下面的方法並授予管理員權限。一旦在數據庫中進行了任何修改,就會從外部調用此方法來刷新緩存。

public void refreshCache() 
    { 
     try { 
      Map<String, ClassMetadata> classesMetadata = sessionFactory.getAllClassMetadata(); 
      for (String entityName : classesMetadata.keySet()) { 

       sessionFactory.evictEntity(entityName); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
+0

謝謝。這正是我現在計劃要做的。我的查詢不是基於實體的,因此我正在驅逐所有查詢區域。不過,如果有其他方法可以自動執行此操作,而無需維護開銷,我會很樂意實現。 – dj8485

0

那麼,如果你使用的是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 
+0

我正在使用MySQL。 – dj8485