用于缓存的Java EE@Singleton EJB



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

我想从实现的角度知道,使用@SingletonEJB,这是否正确?或者你能给我推荐另一种方法吗?从OOP的角度来看,这是否正确?

@SingletonEJB是只读的,我可能会遇到任何并发问题吗?

问候,

这种方法还可以,但缺点是以后增强解决方案并不简单——没有好的接口。但对于每台JavaEE服务器来说都是可能的,因为它是标准的JavaEE,所以不需要任何迁移工作。

另一种解决方案在一定程度上取决于您使用的服务器。

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

JBoss EAP(企业产品):在这里你不能使用Infinispan子系统,技术上它是可能的,但它不受支持。您需要使用额外的基于infinispan的JBossDataGrid(JDG)。这里有更多的选项,和上面一样,使用同一JVM本地或dist/repl中的缓存。或者在另一个对缓存进行远程访问的实例上——通常足够快,但您只有一次远程访问——但JVM与服务器完全分离,可以以不同的方式启动和维护。此外,服务器和缓存不会相互影响内存。

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

作为一个快速简单的解决方案,Singleton EJB可以提供帮助,尤其是在值不变的目录中
只需考虑您的EJB Singleton建立以下内容:

  • 按容器进行并发管理
  • 由任意数量的客户端同时访问的用于建立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;
    }
}

最新更新