2016-07-22 38 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; 

    } 
}