用于缓存的Java EE @Singleton EJB

时间:2016-07-22 07:11:48

标签: caching java-ee singleton ejb

我正在使用Java EE开发应用程序,我想使用@Singleton EJB实现缓存。这会缓存参考数据,因此我只需要从数据库中检索一次,然后将其存储在内存中。

我想从实现的角度来看,如果这是正确的,使用@Singleton EJB?或者你能推荐我另一种方法吗?如果从OOP的角度看这是正确的呢?

@Singleton EJB是只读的,我遇到的并发问题是什么?

问候,

2 个答案:

答案 0 :(得分:1)

方法还可以,但缺点是以后增强解决方案并不简单 - 没有好的界面。 但是,对于每个JavaEE服务器而言,没有任何迁移工作可能,因为它是标准的JavaEE。

另一种解决方案取决于您使用的服务器。

WildFly(社区):您可以使用内部infinispan子系统,并以HashMap方式使用。如果缓存增长并且需要更多内存来缓存它,您可以简单地使用本地开始并将配置更改为群集(复制或分发)。

JBoss EAP(企业产品):在这里您无法使用Infinispan子系统,技术可行,但不支持。您需要使用基于infinispan的附加JBossDataGrid(JDG)。 这里有更多选项,与上面相同,在同一个JVM本地或dist / repl中使用缓存。或者在远程访问缓存的不同实例上 - 通常足够快但您有一个远程访问权限 - 但JVM与服务器完全分离,可以开始保持不同。服务器和缓存也不会影响彼此的内存。

对于其他供应商,您也可以使用JDG方法(或Infinispan作为OpenSource)。

答案 1 :(得分:0)

作为一种快速简便的解决方案,Singleton EJB可以提供帮助,尤其是在值不会更改的目录时。
只需考虑您的EJB Singleton建立以下内容:

  • Container的并发管理
  • 建立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;

    }
}