Java 这是否违反了EJB限制?
我已经阅读了EJB的限制以及这里关于stackoverflow的一些答案,但是我不太确定我在工作中发现的一段代码 有一个服务根据foo的标识符提供有关foo的详细信息Java 这是否违反了EJB限制?,java,multithreading,ejb,restriction,Java,Multithreading,Ejb,Restriction,我已经阅读了EJB的限制以及这里关于stackoverflow的一些答案,但是我不太确定我在工作中发现的一段代码 有一个服务根据foo的标识符提供有关foo的详细信息 public FooResponse getFoo(FooRequest request){...}; 在表面之下的某个地方是一个自写池,它保存最近提供的响应对象。对于每个请求,都会询问池是否有可用的条目。如果是,则将其用作响应,如果不是,则将询问数据库。当从数据库中获取响应时,它将存储在池中 池使用两种策略来管理其大小。 首先
public FooResponse getFoo(FooRequest request){...};
在表面之下的某个地方是一个自写池,它保存最近提供的响应对象。对于每个请求,都会询问池是否有可用的条目。如果是,则将其用作响应,如果不是,则将询问数据库。当从数据库中获取响应时,它将存储在池中
池使用两种策略来管理其大小。
首先,它在映射中使用java.lang.ref.SoftReference
,以避免OutOfMemoryError
s。
它使用的第二个东西是java.util.TimerTask
,它是为Map
中的每个条目创建的,并由java.util.Timer
调度,它在可配置的时间量之后删除该条目
在我看来,这违反了限制,EJB不允许创建线程(java.util.Timer
就是这样做的)。我是对的还是我遗漏了什么?
直到今天,这还没有造成任何明显的问题。您是否建议删除此自编码池
另一件事是,该服务是一个无状态SessionBean。容器将不仅创建其中一个。因此,他们不共享同一个池,如果一个bean被问及
Foo
两次,那将是幸运的。我说的对吗?创建自己的线程的主要问题是,这意味着它们不在应用程序服务器的控制范围内,这可能导致流氓EJB通过创建太多线程“破坏服务器”的情况
然而,拥有后台线程是一件理想的事情,因此通常应用服务器提供“工作管理器”来安排任务(使用计时器或并行线程)
下面是一篇关于CommonJ with Websphere的文章,它提供了如何在不破坏服务器的情况下使用线程的背景知识:
以下是Weblogic的CommonJ文档:
尽管可能离题,但以下是spring如何与工作经理集成:
为了解决您的问题,我将与缓存集成(例如),并让它确定何时从缓存中逐出项目
(同样,可能是离题的,使用Spring可以使使用缓存成为向代码中添加一些注释的问题:)为什么首先需要一个池?显然,每次读取数据库时都会避免很多麻烦,让操作系统、数据库和驱动程序担心缓存问题。你有没有在没有游泳池的情况下测量过成绩?我希望,我能给你一个答案。这是某个人的主意,另一个人把它编码了。我突然发现了这部分代码,当我问作者,这是否符合EJB标准,或者为什么他不使用通用标准时,我没有得到真正的答案,现在它就在那里了。。。。