【问题标题】:Tomcat8/Spring/JAX-RS - Is it safe to have thread local variables in http-bio-8080-exec-XYZ threads?Tomcat8/Spring/JAX-RS - 在 http-bio-8080-exec-XYZ 线程中使用线程局部变量是否安全?
【发布时间】:2017-02-18 14:54:11
【问题描述】:

我的堆栈是 Tomcat8,上面有 Spring 和 JAX-RS (Jersey)。这会公开一个供最终用户使用的 REST API。在这些 REST 端点中,我需要一个到古老后端的套接字连接。为每个请求设置和销毁这些套接字连接的成本很高。我正在考虑将连接存储在线程局部变量中。

要做到这一点,我们需要保证 http-bio-8080-exec-[identifier] 线程永远不会被杀死。如果是这种情况,我们最终会得到一个永远不会关闭的悬空套接字连接。最终,我们将耗尽可用的套接字(内存泄漏)。

我浏览了几个文档,但找不到任何有用的东西。所以我的问题是:http-bio-8080-exec-[identifier] 线程后面的线程池只会增长,还是会缩小?

另一种选择是引入一个保存套接字连接的旧对象池,但我认为线程本地方法会更好,因为每个 REST 请求都需要该套接字连接,所以池的大小是相同的作为 http 工作人员的数量。在这种情况下,这是使用线程局部变量而不是对象池的好理由吗?

【问题讨论】:

    标签: java spring multithreading jax-rs tomcat8


    【解决方案1】:

    如果没有文档证明它是安全的,那么您不能假设它是安全的,或者至少它可能会在 Tomcat 版本之间发生变化。

    Tomcat 创建的线程数取决于应用程序的负载。最大数量是可配置的,我认为当负载减少时它也会下降。

    但是,您可以使用过滤器在每个请求开始时获取一个套接字(来自池的现有套接字或新套接字)并将其设置在 ThreadLocal 中(或者由于您使用的是 Spring,因此是请求范围的 bean )。当请求结束时,您的 Filter 会将 Socket 返回到池中以供重复使用。

    【讨论】:

      猜你喜欢
      • 2012-06-12
      • 1970-01-01
      • 2017-03-07
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多