2011-04-24 56 views
3

我正在開發一個簡單的Java EE 5「路由」應用程序。首先轉換來自MQ隊列的不同消息,然後根據某個字段的值存儲在不同的數據源中(需要調用不同ds中的存儲過程)。在Java EE中緩存DataSource查找安全嗎?

例如,valueX - > dataSource1,valueY - > dataSource2。所有數據源都在具有不同jndi條目的應用程序服務器中設置。由於路由信息通常在應用程序運行時不會更改,因此它是否可以緩存數據源查找?例如,我將實現一個單例,其中包含一個散列圖,用於存儲valueX-> DataSource1。當某個條目不在列表中時,我將執行資源查找並將結果存儲在地圖中。我是否獲得了緩存的任何性能,或者這些資源查找是否足夠快?

一般來說,構建這種緩存的最好方法是什麼?我也可以使用緩存來查找其他數據庫查詢。例如,映射值X - >資源名稱是在DB中的簡單表中定義的。它是否更好?是否按需查找值並將結果保存在地圖中,始終執行查找,甚至在啓動時讀取並保存所有條目?我需要同步訪問嗎?我可以創建一個「枚舉」單例實現嗎?

回答

4

從操作/變更管理的角度來看是安全的,但對程序員來說是不安全的。

從程序員的PoV中,DataSource配置可以在運行時更改,因此應該總是重複查找。

但這並不是現實生活中發生的事情。

當要對數據源進行更改時,這是通過更改管理過程完成的。有一個c/r記錄,並且該記錄指出應用程序將有停機時間。換句話說,執行c/r的操作人員會關閉應用程序,執行更改並將其恢復。出於安全原因,沒有人在現場AS上做這樣的改變。因此,您不應該考慮DS在運行時發生更改的可能性。

所以任何永久同步共享緩存在這種情況下都不錯。

你會得到性能提升嗎?這取決於AS實現。它可能擁有自己的緩存,但該緩存可能更通用,速度更慢,實際上根本不能指望它的存在。

您是否需要構建緩存?答案通常來自性能測試。如果沒有問題,爲什麼浪費時間並引入風險?

簡歷:是的,建立一個簡單的緩存並使用它 - 如果它是由業績增長合理。

具體實施取決於您的喜好。我通常有一個按需查詢的緩存,並且裏面有jndi-> object的同步映射。對於高併發緩存我會使用讀/寫鎖,而不是天真的同步 - 即多讀可以去並行,同時增加了新的條目得到的獨家訪問。但這些細節很大程度上取決於應用程序的細節。

+0

好的。在真實的生活場景的Agreed.The詳細描述確實擊中靶心。;-)那麼,在您看來,什麼是做的最好的方法是什麼?一個帶有HashMap並且不同步的枚舉類? – Ingo 2011-04-24 19:01:56

+0

同步。當作者重建地圖時,你不希望讀者感到困惑。 – 2011-04-24 21:54:17