Tomcat8/Spring/JAX-RS - 在 http-bio-8080-exec-XYZ 线程中使用线程局部变量是否安全?

Tomcat8/Spring/JAX-RS - Is it safe to have thread local variables in http-bio-8080-exec-XYZ threads?

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

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

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

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

如果没有记录它是安全的,那么您不能假设它是安全的,或者至少它可以在 Tomcat 版本之间改变。

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

但是,您可以使用过滤器在每个请求开始时获取套接字(池中的现有套接字或新套接字)并将其设置在 ThreadLocal 中(或者因为您正在使用 Spring, 一个 Request 范围的 bean)。当请求结束时,您的 Filter returns 将 Socket 添加到 re-use.

的池中