2011-06-05 32 views
1

我有一個具有層次關係的數據庫(可以表示爲樹)。
現在,無論什麼時候請求進入服務器,在數據庫中執行遞歸查詢以創建內存列表(這是樹的分支,從葉到實際存在的根目錄),並使用 進行處理該清單。
這不是非常有效,但至少現在可以工作,並且具有如下優點:如果更改了數據庫,則立即發現更改。
無論如何,我想改善它,尋找一個模式:
1)不具有訪問DB如果變化在DB做了所有的時間
2),它得到immediatelly反映
3)它可以在服務器的所有地方使用。
是否有像這樣的案例常用的標準設計模式?或者只是通過後端線程和數據庫中的任何更新維護數據結構,重新加載數據結構中的所有內容?關於Java中數據庫設計方法的問題

謝謝

+0

對不起,我不明白。你是否要求表示適合處理的層次結構(不是每次都在內存中構建結構)? – damluar 2011-06-05 21:11:23

+0

這個項目是一個使用自定義框架訪問數據庫的舊項目(它比Hibernate早,並且沒有被重構爲使用更新的框架)。因此,我正在尋找一種自定義解決方案來緩存實際數據記憶並在需要時更新它們。 – Cratylus 2011-06-05 21:24:34

+0

我完全同意@iruediger。這聽起來需要在數據庫中插入/更新/刪除更新的緩存。 – Rudy 2011-06-06 03:18:44

回答

2

而不是你可以使用緩存解決方案的線程。查詢的結果將被緩存並在每個請求上返回,如果查詢中的任何表被修改,則使緩存無效,等到下一個請求檢索新值並將其加載到緩存中。該解決方案符合要求1和2.您的意思是「它可以用於服務器的所有地方」?

如果您使用的是Hibernate,可以通過second level cache輕鬆完成,但需要注意的是您必須確保只有您的應用程序更改數據庫(無需外部進程)。

如果您不使用Hibernate,您可以使用Ehcache推出自己的解決方案。在查詢數據庫之前,您需要更改返回結構的方法來檢查緩存。對涉及的表進行更改的方法必須進行修改才能使緩存無效。

Ehcache也有integration with Spring,但我從來沒有嘗試過。

+1

恕我直言,Spring沒有緩存解決方案。但他們已經與EHCache接口,我聽說它很好。 – Rudy 2011-06-06 03:16:03

+0

@Rudy你說得對,它不是一個緩存解決方案。我糾正了我的帖子。 – iruediger 2011-06-06 10:18:24

1

您不會詳細說明使用哪種ORM工具,但在Hibernate中,這可以通過聲明子項列表來實現。下面是從生產代碼採取:

<hibernate-mapping> 
    <class name="YourTreeClass" table="tree_table" dynamic-insert="true" dynamic-update="true"> 
    ...other properties... 

     <list name="children" cascade="save-update" inverse="false" > 
     <cache usage="nonstrict-read-write"/> 
     <key column="parent_id"/> 
     <one-to-many class="YourTreeClass" /> 
     </list> 
    </class> 
</hibernate-mapping> 

無需哈克後臺線程 - 節點更新,Hibernate的照顧和無效的相關緩存條目。

+0

該項目是一個使用自定義框架訪問數據庫的舊項目(它比Hibernate早,並且未使用新框架重構)。所以我正在尋找一個自定義解決方案 – Cratylus 2011-06-05 21:23:18

+0

Doh!你應該在一開始就說過。 – mindas 2011-06-05 21:33:30

+0

你說得對,我錯了 – Cratylus 2011-06-05 21:50:48