gpt4 book ai didi

java - 有没有办法在关闭时使用 ContextListener 关闭 contextDestroyed() 方法中的所有 ThreadLocals(保存 Session 对象)?

转载 作者:行者123 更新时间:2023-11-28 22:46:39 28 4
gpt4 key购买 nike

我在我的应用程序中面临内存泄漏(TOMCAT v9),如下所示:

2019 年 9 月 25 日 17:40:34.752 严重 [Thread-10] org.apache.catalina.loader.WebappClassLoaderBase.checkThreadLocalMapForLeaks Web 应用程序 [] 创建了一个 ThreadLocal,键类型为 [java.lang.ThreadLocal] (值 [java.lang.ThreadLocal@7c606bab]) 和类型 [org.hibernate.internal.SessionImpl] 的值(值 [SessionImpl(56310373)]),但在 Web 应用程序停止时未能将其删除。线程将随着时间的推移而更新,以尝试避免可能的内存泄漏。

每次我们打开 session 对象时,我都尝试关闭 session 对象,但是由于编码中使用的标准不足,我面临着各种 Hibernate 级别的异常,因为某些对象是延迟获取的,关闭 session 会导致意外异常。

现在,如果可能的话,我正在尝试使用 contextListener 来实现同样的事情,而不用担心关闭每个 session 对象。

我试过使用 System.gc() 但它似乎并没有释放那些 ThreadLocal 对象。

能否请您提出一些在关机时使用 Listener 或任何其他可能的方式摆脱这些对象的方法?

最佳答案

当 Web 请求完成时,您应该关闭 Hibernate session 并将其从 ThreadLocal 中删除。

由于您似乎在生成响应(JSP?)时遇到延迟加载问题,因此您需要在响应完全生成后执行此操作。

您可以在 Servlet Filter 中执行此操作。确保这是您拥有的任何其他过滤器之前,因此 session 将作为最后步骤关闭。

public final class SessionCloseFilter implements Filter {
public void init(FilterConfig filterConfig) throws ServletException {
}

public void destroy() {
}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
try {
chain.doFilter(request, response);
} finally {
try {
// Close and remove session here
} catch (Exception e) {
// Log but don't throw the exception
}
}
}

}

关于java - 有没有办法在关闭时使用 ContextListener 关闭 contextDestroyed() 方法中的所有 ThreadLocals(保存 Session 对象)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58107080/

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