`

ThreadLocal在应用中,因服务器线程复用导致问题

 
阅读更多

应用服务器,对于每个请求,会开设一个线程用于处理请求,为了提高响应速度,服务器端一般都会配置启用线程池,而线程池中的线程,是会存在复用的可能,这样对于使用ThreadLocal来让线程共享数据时,如果一个线程处理结束后,没有从ThreadLocal剔除数据时,可能存在数据被他用的可能,更严重导致内存泄露(见:http://my.oschina.net/ainilife/blog/261297)。截止目前,系统出现过2次因该原因,导致数据被他用:

1、利用threadlocal来存放当前操作人员信息,便于记录日志时,无需传参就可以拿到当前操作人员信息,结果发现日志记录的人员信息与真实不一致

2、利用threadlocal来管理数据库连接conn,因为线程复用问题,拿到被关闭的conn,导致失败

 

解决方法,在线程处理结束前,从threadlocal中remove该线程的数据

 

另外,此次还出现一个症状,应用使用commons-dbutils-x.x.jar来负责conn的关闭,



 

 

 注意:如果传递conn进去,dbutils不会负责把conn关闭,因为conn是外部提供,不能武断关闭。

结果我们没注意到这个差异,调用了传递conn的方法,并天真认为会帮忙关闭,结果导致数据库连接池耗尽,教训深刻,仅此自我批评一下啊~~~大家引以为鉴

  • 大小: 23.2 KB
  • 大小: 16.5 KB
  • 大小: 20.2 KB
分享到:
评论

相关推荐

    ThreadLocal的几种误区

    但在实际应用服务器环境中,由于线程池的存在,多个用户请求可能会复用同一个线程。因此,开发者在使用ThreadLocal时必须小心,避免在ThreadLocal中存储长期有效的数据,防止其他线程意外访问。 误区四:...

    java单线程多线程clientserver

    在客户端-服务器应用中,还需要考虑线程安全问题,确保在多线程环境下,数据的一致性和完整性。这可能涉及到数据库事务、锁机制以及线程局部存储(ThreadLocal)等。 总的来说,理解并熟练掌握Java中的单线程和多...

    深入研究Servlet线程安全性问题

    Servlet线程安全性问题是一个在Java Web开发中至关重要的议题,特别是在高并发环境下。Servlet作为Java服务器端组件,其默认的多线程模型使得一个Servlet实例可能会被多个客户端请求同时调用,这就要求开发者对线程...

    1工作临时-servlet 多线程问题

    标题中的“1工作临时-servlet 多线程问题”表明我们即将探讨的是在实际工作中遇到的一个与Servlet和多线程相关的技术难题。Servlet是Java Web开发中用于处理HTTP请求的服务端组件,而多线程则涉及到并发编程,是...

    多线程的实例

    例如,在Web服务器中,每个线程可以处理一个客户端请求,避免了单线程模型中的阻塞等待,提高了服务效率。在GUI应用程序中,可以使用一个线程来处理用户交互,另一个线程处理后台计算,保持界面的响应性。此外,多...

    Servlet线程安全的解决方法

    当多个线程同时访问同一个Servlet时,如果这些线程同时修改了Servlet中的共享资源(例如实例变量),那么就可能会导致数据不一致性的问题,从而引发一系列的安全性问题。 #### 一、理解Servlet线程安全问题 ...

    jsp线程学习上课代码

    8. **线程安全的Java集合**:在多线程环境中,使用线程安全的集合类(如`ConcurrentHashMap`、`Vector`)可以避免并发问题。 9. **JSP内置对象与线程安全**:JSP的内置对象(如`session`, `request`, `response`)...

    多线程01(md文档+代码)多线程01(md文档+代码)(超详细)

    在IT行业中,多线程是程序设计中的一个重要概念,尤其在服务器端开发、并发处理以及高性能计算中扮演着核心角色。本资源包“多线程01”包含了关于多线程的详细讲解,包括Markdown文档和配套代码示例,旨在帮助初学者...

    java多线程设计

    在Java中,多线程可以通过继承Thread类或实现Runnable接口来实现。下面我们将深入探讨这个主题,包括核心概念、设计模式以及如何在实际项目中应用这些知识。 1. **线程基础** - **线程定义**:线程是程序执行的...

    JAVA多线程与线程安全实践-基于Http协议的断点续传

    在Java编程中,多线程和线程安全是核心概念,尤其在开发高效、响应迅速的应用时更是不可或缺。本主题将深入探讨如何在Java中实现多线程,并结合HTTP协议来实现断点续传功能,这在大文件传输场景中非常实用。 一、...

    java多线程设计模式详解(PDF及源码).rar

    10. 实践案例:压缩包中的源码部分可能会包含一些实际应用场景的示例,如Web服务器的线程模型、定时任务的实现等,通过分析这些代码,你可以更直观地理解多线程设计模式的运用。 这个资料集可以帮助你深入理解Java...

    多线程面试专题及答案.zip

    在IT行业中,多线程是程序设计中的一个重要概念,尤其在服务器端开发、并发处理以及高性能计算领域。这个“多线程面试专题及答案.zip”压缩包文件包含了一个PDF文档,很可能是为准备IT面试的求职者提供的学习资料,...

    DAO多线程的技巧.rar_dao

    - **连接池**:在多线程应用中,使用连接池(如HikariCP、C3P0、Druid等)管理数据库连接,可以有效复用数据库连接,减少连接创建和释放的开销,提高系统性能。 - **事务管理**:在多线程环境下,事务管理需要谨慎...

    后端必备+服务器网络编程指南

    在服务器网络编程中,可能需要关注的问题有:减少网络延迟、优化数据序列化与反序列化、缓存策略的实施等。通过有效的性能调优,可以显著提高服务的响应速度,降低资源消耗,提升用户体验。 “Java网络编程从入门到...

    Java并发程序设计教程

    同时,针对线程局部变量的使用应当注意ThreadLocal可能会导致内存泄漏的问题,特别是当ThreadLocal被频繁创建且没有调用remove方法释放时。因此,合理管理ThreadLocal变量的生命周期至关重要。 在并发数据结构中,...

    java thread的教程

    线程不仅在传统的后台服务程序中发挥着重要作用,在现代的应用开发中也越来越不可或缺。 **常见应用场景:** - **网络服务器**:处理客户端连接请求,每个连接可能由一个单独的线程处理。 - **GUI应用程序**:用户...

    servlet 模拟

    在Servlet中,理解线程安全至关重要,因为Web服务器通常会并发地处理多个请求,而每个请求都可能由单独的线程来执行。当我们说一个Servlet是线程不安全的,意味着在多线程环境下,该Servlet的行为可能会出现问题,如...

    java并发编程实战、驾校K1考试试卷批量生成源代码(分布式应用和Vue)

    在并发编程实战中,要特别注意线程安全问题,避免死锁、活锁和饥饿现象。使用并发工具时,要理解其工作原理,避免竞态条件和数据不一致。在分布式应用设计中,要考虑网络延迟、容错机制、数据一致性模型等因素,确保...

Global site tag (gtag.js) - Google Analytics