我正在使用Java EE开发应用程序,我想使用@Singleton
EJB实现缓存。这会缓存参考数据,因此我只需要从数据库中检索一次,然后将其存储在内存中。
我想从实现的角度来看,如果这是正确的,使用@Singleton
EJB?或者你能推荐我另一种方法吗?如果从OOP的角度看这是正确的呢?
@Singleton
EJB是只读的,我遇到的并发问题是什么?
问候,
答案 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建立以下内容:
例如:
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;
}
}