Java 这是否违反了EJB限制?

Java 这是否违反了EJB限制?,java,multithreading,ejb,restriction,Java,Multithreading,Ejb,Restriction,我已经阅读了EJB的限制以及这里关于stackoverflow的一些答案,但是我不太确定我在工作中发现的一段代码 有一个服务根据foo的标识符提供有关foo的详细信息 public FooResponse getFoo(FooRequest request){...}; 在表面之下的某个地方是一个自写池,它保存最近提供的响应对象。对于每个请求,都会询问池是否有可用的条目。如果是,则将其用作响应,如果不是,则将询问数据库。当从数据库中获取响应时,它将存储在池中 池使用两种策略来管理其大小。 首先

我已经阅读了EJB的限制以及这里关于stackoverflow的一些答案,但是我不太确定我在工作中发现的一段代码

有一个服务根据foo的标识符提供有关foo的详细信息

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标准,或者为什么他不使用通用标准时,我没有得到真正的答案,现在它就在那里了。。。。