我正在开发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