我正在開發Java EE中的應用程序,我想使用EJB的@Singleton
來實現緩存。這種緩存參考數據,所以我只需要從DB中檢索一次,然後將其存儲在內存中。用於緩存的Java EE @Singleton EJB
我想從實施的角度來看,如果這是正確的,請使用@Singleton
EJB?或者你能推薦我另一種方法嗎?如果從面向對象的角度來看這是正確的?
而@Singleton
EJB是用於只讀的,是否有任何併發問題可以遇到?
問候,
我正在開發Java EE中的應用程序,我想使用EJB的@Singleton
來實現緩存。這種緩存參考數據,所以我只需要從DB中檢索一次,然後將其存儲在內存中。用於緩存的Java EE @Singleton EJB
我想從實施的角度來看,如果這是正確的,請使用@Singleton
EJB?或者你能推薦我另一種方法嗎?如果從面向對象的角度來看這是正確的?
而@Singleton
EJB是用於只讀的,是否有任何併發問題可以遇到?
問候,
的做法是好的,但美中不足的是,是不是簡單的提升後的解決方案 - 沒有漂亮的界面。 但是,由於它是標準JavaEE,因此無需任何遷移工作就可以使用每個JavaEE服務器。
另一個解決方案取決於您使用的服務器上的一點點。
WildFly(社區):您可以使用內部infinispan子系統並使用HashMap方式。如果緩存增長並且需要更多內存來緩存它,您可以簡單地使用它在本地開始,並將配置更改爲羣集(複製或分發)。
JBoss EAP(企業產品):在這裏你不能使用Infinispan子系統,技術上它是可能的,但它不被支持。您需要使用基於infinispan的額外的JBossDataGrid(JDG)。 這裏有更多選項,與上面相同,使用相同JVM local或dist/repl中的緩存。或在不同的實例與該緩存遠程訪問 - 往往不夠快,但你有一個遠程訪問 - 但是JVM從服務器完全分離,就可以開始保持不同。此外,服務器和緩存不會影響其他內存。
對於其他供應商,您也可以使用JDG方法(或Infinispan作爲開源)。
作爲一個快速簡便的解決方案辛格爾頓EJB可以幫助,特別是如果目錄,其值不會改變。
試想你的EJB辛格爾頓建立如下:由集裝箱
例如任意數目的併發訪問:
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;
}
}
完成J2EE應用程序中所有的時間和建議只讀數據。唯一的問題是,如果Db發生變化,那麼無論您需要重新加載,還是反映您何時重新啓動應用程序。 –
既然你可以重新加載,更新,刷新同一個觀察者,它不是一個真正的漁獲物。 http://docs.oracle.com/javaee/6/tutorial/doc/gkhic.html – keni