我有使用弹簧的Web应用程序和休眠和支柱(它运行在Tomcat)

在调用顺序是这样的......

Struts动作调用弹簧服务豆后者又调用弹簧DAO豆。 DAO实现是一个Hibernate实现。

<强>问题是 将我的所有的Spring beans在同一个线程中运行? 我可以存储在ThreadLocal的东西,并把它在另一个豆?

我敢肯定这不会在Stateless Session Bean的工作。 EJB容器可以(或将要)生成一个新的线程每次调用会话bean

<强>将弹簧容器做?即,在相同的线程中运行的所有豆吗

当我尝试了JUnit测试 - 在测试用例我通过Thread.currentThread()得到了相同的ID的getId()和两个beans-这使我相信,在行动只有一个线程

或者是不可预测的行为? 或Tomcat服务器上运行时将其更改?

<强>澄清 我不希望两个线程之间交换数据。我希望把数据在ThreadLocal中,并能够从调用堆栈的所有豆类检索。这种方法仅如果所有豆是在同一个线程

有帮助吗?

解决方案

Spring不产卵线程。 Tomcat的一样。春天刚刚创建和连接最多的对象适合你。

从浏览器的每个请求在一个请求被处理。它是由Tomcat处理该请求。它是Tomcat的创建该线程来处理该请求。

假设你刚刚创建的春天一个singleton bean称为“X”。然后X的同一个实例是由所有请求。

在Spring bean的不住在一个线程。他们只是在堆中分配。

其他提示

  

请问我所有的春豆运行   在同一个线程?我可以存储   东西在ThreadLocal中,并得到   它在另一个豆?   据我所知你提到的组件(服务豆,豆DAO - 我猜他们是普通的Spring bean),Spring不会产生一个新的线程。我不明白你的使用情况(即两个线程之间的数据交换)。

对于大多数web应用中,产生新线程为每个新的请求,如果你想分享两个请求你通常之间的数据:   - 使用GET / POST参数传递数据   - 使用会话以共享数据

要回答你的问题,我敢肯定,Spring容器不会产生线程大多数组件。

是的,你可以做到这一点。相同的线程将被用来执行你的行动,使ThreadLocal的正常工作。通常情况下,在同一个线程用于无状态会话bean以及,假设它是在同一个应用服务器实例上运行。我不会依赖于该不过,因为它可能是供应商有关。

我们使用这种技术来在任何地方访问呼叫者身份中的代码。我们使用会话Bean和JMS一样好,但明确地传递容器之间的信息并设置ThreadLocal的每个入口点。这样一来,如果这个bean(会话或MDB)是本地或者并不重要。

除了所有其他的答案,我只是补充以下内容:

通常,为了切换线程的唯一原因是,因为对一些parallellity要求。由于这通常不会在复杂性方面都为免费,您通常会明确当发生这种情况通报。

内似乎是一个请求的单线程处理切换线程实际上是极其复杂的。这通常只发生在一个容器中的一个地方,而这通常是由接收来自外部客户端请求的TCP / IP套接字读者处理。这些读取器线程通常确定哪些线程(池)应该处理该请求并转发该请求到该线程。在此之后,请求保持与该线程。

因此,一般来说,将/可能发生的唯一事情是,额外的线程得到平行性或异步处理(如JMS)创建。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top