gpt4 book ai didi

java - Tomcat servlet 中的 ThreadLocal

转载 作者:搜寻专家 更新时间:2023-11-01 03:26:50 25 4
gpt4 key购买 nike

我遇到了一个问题,即我的生产系统中出现了异常,但我确实没有关于导致它们的原因的准确信息。此人的用户名作为变量存储在他们的 tomcat session 中,显然我可以在我的 doPostdoGet 方法中访问它,但除非我将该信息作为参数传递下去对于我的每个业务对象,我无权访问 session 。出于显而易见的原因,我想将用户名附加到日志消息中,以便我了解发生了什么。

所以我的解决方案是做这样的事情

public class ExceptionUtil {
private ExceptionUtil() { } // no instantiation
private static final ThreadLocal<String> local = new ThreadLocal<String>();
public static void set(String user) { local.set(user); }
public static String get() { return local.get(); }
}

然后在我的帖子/获取中,我可以这样做

String username = request.getSession().getAttribute("username");
ExceptionUtil.set(username);

然后在我的异常(exception)情况下,我可能会这样做(人为的,糟糕的做法示例)

catch(SQLException e) {
logger.error(ExceptionUtil.get() + " did something dumb in sql", e);
throw e;
}

我唯一关心的问题是 Tomcat 将如何管理我的线程。如果他们保留线程怎么办?他们会坚持吗? ThreadLocal 值是否也会持续存在?如果我将整个 Session 存储在 ThreadLocal 中而不只是一个 String,那将是一个严重的内存泄漏可能性。这也意味着,如果有人忘记重新设置(或忘记在完成后清除)在为多个请求持续存在的线程上的用户名/ session ,则其中可能存在陈旧数据。

说我愤世嫉俗,但我不想依赖程序员(甚至,尤其是我自己!)不要忘记为程序的正确性做事。如果我可以证明我的代码是白痴,我愿意。这意味着更好地了解 Tomcat 将如何使用线程。

所以,单句形式的问题:

If I use ThreadLocal in a webapp running on Tomcat (7.0.27), do I run the risk of a Thread being used for multiple requests, and with it data from a previous request being persisted?

我应该指出,即使他们没有回答“Tomcat/ThreadLocal shenanigans”的确切问题,我也愿意接受其他解决方案,这些解决方案允许我优雅地访问 session 变量以进行日志记录。我也乐于接受有关我的解决方案的潜在缺陷的评论。我有一个业务问题要解决,而且我不接受任何一种解决方案。我只想知道是谁一直在导致我的产品系统出现异常 :)

最佳答案

是的,tomcat 使用 ThreadPool 概念,这意味着线程正在被重用,因此正如您所建议的“您的线程本地保留值”,

我建议的替代方案可能是

  1. 完成后在 View Controller 的某处清理线程

  2. 编写请求过滤器并在过滤器开始时清理所有内容并推送新值,并将其分配给您服务器上的每个 url 模式

对于您正在遵循的方法,而不是在类中保存某些值,将请求存储在 Thread Local 中,然后使用该请求使用自制的 util 类从 session 中提取值,该类接受请求然后返回您想要的值,这样您就可以在 Thread 中保存 session 并获取值,但是请确保您每次都添加新鲜的并在完成后清理请求(为此使用第二个选项)。

关于java - Tomcat servlet 中的 ThreadLocal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11910359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com