2016-07-22 68 views
1

我正在開發Java EE中的應用程序,我想使用EJB的@Singleton來實現緩存。這種緩存參考數據,所以我只需要從DB中檢索一次,然後將其存儲在內存中。用於緩存的Java EE @Singleton EJB

我想從實施的角度來看,如果這是正確的,請使用@Singleton EJB?或者你能推薦我另一種方法嗎?如果從面向對象的角度來看這是正確的?

@Singleton EJB是用於只讀的,是否有任何併發​​問題可以遇到?

問候,

+1

完成J2EE應用程序中所有的時間和建議只讀數據。唯一的問題是,如果Db發生變化,那麼無論您需要重新加載,還是反映您何時重新啓動應用程序。 –

+0

既然你可以重新加載,更新,刷新同一個觀察者,它不是一個真正的漁獲物。 http://docs.oracle.com/javaee/6/tutorial/doc/gkhic.html – keni

回答

0

的做法是好的,但美中不足的是,是不是簡單的提升後的解決方案 - 沒有漂亮的界面。 但是,由於它是標準JavaEE,因此無需任何遷移工作就可以使用每個JavaEE服務器。

另一個解決方案取決於您使用的服務器上的一點點。

WildFly(社區):您可以使用內部infinispan子系統並使用HashMap方式。如果緩存增長並且需要更多內存來緩存它,您可以簡單地使用它在本地開始,並將配置更改爲羣集(複製或分發)。

JBoss EAP(企業產品):在這裏你不能使用Infinispan子系統,技術上它是可能的,但它不被支持。您需要使用基於infinispan的額外的JBossDataGrid(JDG)。 這裏有更多選項,與上面相同,使用相同JVM local或dist/repl中的緩存。或在不同的實例與該緩存遠程訪問 - 往往不夠快,但你有一個遠程訪問 - 但是JVM從服務器完全分離,就可以開始保持不同。此外,服務器和緩存不會影響其他內存。

對於其他供應商,您也可以使用JDG方法(或Infinispan作爲開源)。

0

作爲一個快速簡便的解決方案辛格爾頓EJB可以幫助,特別是如果目錄,其值不會改變。
試想你的EJB辛格爾頓建立如下:由集裝箱

  • 併發管理
  • 建立LockType.READ所有方法,通過客戶

例如任意數目的併發訪問:

import java.util.List; 

import javax.annotation.PostConstruct; 
import javax.ejb.ConcurrencyManagement; 
import javax.ejb.ConcurrencyManagementType; 
import javax.ejb.Lock; 
import javax.ejb.LockType; 
import javax.ejb.Singleton; 
import javax.ejb.Startup; 

@Singleton 
@Startup 
@ConcurrencyManagement(ConcurrencyManagementType.CONTAINER) 
public class InitializationBean { 

    @PostConstruct 
    public void initialize() { 
     // load data 
    } 

    @Lock(LockType.READ) 
    public List<String> getCatalog01() { 
     return null; 

    } 

    @Lock(LockType.READ) 
    public List<String> getCatalog02() { 
     return null; 

    } 
}