2009-06-23 126 views
1

我使用JBoss AS。我在應用程序服務器中運行了一個很長很長的SQL。我想根據輸入參數緩存結果。在Java EE應用程序中緩存

我這裏有幾個選項:

  1. 使用緩存管理器和手動把結果在緩存中。

  2. 使用帶有加載器的緩存管理器,在緩存中沒有結果時將結果「加載」到緩存中。

我現在不在意將緩存複製到集羣中的其他服務器。

我的問題是我應該選擇什麼樣的選擇?每個選項有哪些優點和缺點? (易於部署,配置混亂)

這是可以使用JBoss Cache或ehcache或兩者來實現。


更新: 我使用休眠,但結果不是實體,它們是計數器。我需要統計屬於特定類別並具有特定狀態的所有行。我想要這個結果被緩存。

我是否應該將結果包裹在實體中?那麼,我怎樣才能使它像oracle中的(物化?)視圖一樣工作 - 自動更新或通過觸發器進行更新。

回答

3

你將不得不走出ResultSet,進入對象的數據,以便進行緩存,爲什麼你不開始使用Hibernate,它提供了使用的選項inclucing了Ehcache一個真理緩存, JBoss緩存和一個簡單的地圖。

http://docs.jboss.org/hibernate/core/4.1/manual/en-US/html/ch20.html#performance-cache

+0

雖然我同意上述,將現有的應用程序到Hibernate可以是一個痛苦,並且不應該被認爲是一項小任務。 – Jesse 2009-06-23 14:15:10

3

對於啓動WeakHashMap可能可以做你現在需要的。

創建兩個類,一個Key包含標識關鍵字所需的值(記得實現equals()和hashcode()),另一個值包含從ResultSet中取出的retreived值。最簡單的可能是一張地圖列表(每行一張地圖)。

當WeakHashMap中的內存不足時,Java將自動使條目無效。

1

如果你只是想快速滾動自己的緩存解決方案,看看this文章JavaSpecialist,這是本書Java Concurrency in PracticeBrian Goetz審查。

它討論了使用FutureTaskConcurrentHashMap來實現基本線程安全緩存。

這樣做的方式確保只有一個併發線程觸發長時間運行的計算(在你的情況下,你的SQL調用)。如果沒有這樣做,那麼當緩存爲空時,你有可能觸發你的SQL調用的多個線程的危險,例如,如果您在啓動應用程序服務器後立即承受沉重負載。顯然,它由你來判斷這對你是否有問題,或者如果你想要一個更簡單的解決方案,最後完成的線程將其結果放到緩存中,那麼這個解決方案會很快樂。

如果您需要,您必須修改此解決方案以添加緩存過期。而且,它不會釋放內存,就像Thorbjørn提出的使用WeakHashMap的建議一樣。