Java 春线

Java 春线,java,multithreading,spring,tomcat,thread-local,Java,Multithreading,Spring,Tomcat,Thread Local,我有一个使用spring、hibernate和struts的Web应用程序(它在Tomcat上运行) 调用顺序是这样的 Struts操作调用spring服务bean,而spring服务bean又调用SpringDAOBean。DAO实现是一个Hibernate实现 问题是 我所有的春豆会在同一个线程中运行吗? 我可以在ThreadLocal中存储一些东西并在另一个bean中获取它吗 我很确定这在无状态会话Bean中不起作用。 EJB容器可以(或将)为会话bean的每次调用生成一个新线程 spri

我有一个使用spring、hibernate和struts的Web应用程序(它在Tomcat上运行)

调用顺序是这样的

Struts操作调用spring服务bean,而spring服务bean又调用SpringDAOBean。DAO实现是一个Hibernate实现

问题是 我所有的春豆会在同一个线程中运行吗? 我可以在ThreadLocal中存储一些东西并在另一个bean中获取它吗

我很确定这在无状态会话Bean中不起作用。 EJB容器可以(或将)为会话bean的每次调用生成一个新线程

spring容器也会这样做吗?i、 e.在同一线程中运行所有bean?

当我尝试JUnit测试时——我通过测试用例中的Thread.currentThread().getId()和两个bean获得了相同的id——这让我相信只有一个线程在运行

还是行为不可预测? 或者在Tomcat服务器上运行时它会改变吗

澄清
我不希望在两个线程之间交换数据。我希望将数据放在ThreadLocal中,并能够从调用堆栈中的所有bean中检索数据。只有当所有bean都在同一个线程中时,这才有效。雄猫会。Spring只是为您创建和连接对象

来自浏览器的每个请求在一个请求中处理。处理请求的是Tomcat。Tomcat创建线程来处理请求

假设您刚刚在Spring中创建了一个名为“X”的单例bean。然后,所有请求都使用相同的X实例

春天的豆子不是一根线。它们只是在堆上分配的

我所有的春豆都会跑吗 在同一条线上?我能去商店吗 在ThreadLocal中找到一些东西,然后 在另一个豆子里? 对于您提到的组件(服务bean、DAOBean——我想它们是普通的Springbean),spring不会产生新线程。我不理解您的用例(即,在两个线程之间交换数据)

对于大多数Web应用程序,每个新请求都会生成一个新线程,如果您想在两个请求之间共享数据,通常可以: -使用get/post参数传递数据 -使用会话共享数据


为了回答您的问题,我非常确定spring容器不会为大多数组件生成线程。

是的,您可以这样做。相同的线程将用于执行您的操作,因此ThreadLocal将工作。通常,假设无状态会话bean运行在同一个AppServer实例中,则该线程也会用于该会话bean。不过,我不会依赖于此,因为它可能依赖于供应商


我们使用这种技术来访问代码中任何地方的调用者身份。我们也使用会话bean和jms,但在容器之间显式传递信息,并在每个入口点设置ThreadLocal。这样,bean(会话或mdb)是否为本地并不重要。

除了所有其他答案之外,我将添加以下内容:

通常,切换线程的唯一原因是对并行性的一些要求。由于这在复杂性方面通常不是免费的,所以发生这种情况时,您通常会得到明确的通知

在请求的单线程处理中切换线程实际上非常复杂。这通常只发生在容器中的一个位置,通常由接收外部客户端请求的tcp/ip套接字读取器处理。这些读卡器线程通常决定哪个线程(池)应该处理请求并将请求转发给该线程。之后,请求将保留在该线程中


因此,通常情况下,唯一会/可能发生的事情是为并行性或异步处理(如JMS)创建额外的线程。

因此,在Tomcat下运行时,我的端到端流是否会在一个线程下?是的,假设所有内容都在同一个应用服务器实例上。这是迄今为止最好的解释。我不希望在两个线程之间交换数据。我希望将数据放入线程中,并能够从调用堆栈中的所有bean中检索数据。只有当所有bean都在同一个线程中时,这才有效…您能发布一些示例代码吗?我不确定你想达到什么目的。我不认为他实际上在使用无状态会话bean?我假设他在Spring中使用POJO作为替代。默认情况下,Spring将以单例的形式创建bean,这意味着在所有请求中共享同一个实例。但如果他在ThreadLocal中存储了一些东西,那就没关系了。我想你关于POJO的观点是正确的,但他确实提到了他认为它不起作用,所以我想这可能是他考虑的另一种选择(有或没有Spring)。我只是想根据我自己做类似事情的经验,给他一些关于这方面的信息。