`

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中内存泄漏和数据丢失问题的问题浅析及解决方案.docx

    ThreadLocal 是 Java 中的一种线程本地存储机制,它可以解决线程之间的数据传递问题。然而,在使用 ThreadLocal 时,可能会出现内存泄漏和数据丢失问题。本文将对 ThreadLocal 中内存泄漏和数据丢失问题进行浅析,...

    java ThreadLocal多线程专属的变量源码

    java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多线程专属的变量源码java ThreadLocal多...

    ThreadLocal原理及在多层架构中的应用

    ThreadLocal原理及在多层架构中的应用

    详解Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失

    主要介绍了详解Spring Cloud中Hystrix 线程隔离导致ThreadLocal数据丢失,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    ThreadLocal原理及在多层架构中的应用.pdf

    ThreadLocal的基本原理,核心机制,源码,ThreadLocal在分布式架构中的应用,ThreadLocal在基础架构,开源中间件,使用非常广泛,建议掌握。

    ThreadLocal:如何优雅的解决SimpleDateFormat多线程安全问题

    目录SimpleDateFormat诡异bug复现SimpleDateFormat诡异bug字符串日期转Date日期(parse)Date日期转String类型(format)SimpleDateFormat出现...注意事项使用ThreadLocal解决SimpleDateFormat线程安全问题总结...

    ThreadLocal

    ThreadLocal入门教程。 讲解了线程安全和ThreadLocal的使用的基本知识。

    线程ThreadLocal机制实现例子

    本例以序列号生成的程序为例,展示ThreadLocal的使用

    04、导致JVM内存泄露的ThreadLocal详解-ev

    04、导致JVM内存泄露的ThreadLocal详解_ev04、导致JVM内存泄露的ThreadLocal详解_ev04、导致JVM内存泄露的ThreadLocal详解_ev04、导致JVM内存泄露的ThreadLocal详解_ev04、导致JVM内存泄露的ThreadLocal详解_ev04、...

    ThreadLocal跨线程问题

    通常复杂的处理流程中,我们会使用一些异步处理的手段,那么这种场景下ThreadLocal即可能出现获取失败的问题。 public class ThreadLocalTest { public static void main(String[] args) { ThreadLocal ...

    java中ThreadLocal详解

    详解java底层实现原理,ThreadLocal底层实现的数据结构,为什么不会导致内存泄露

    ThreadLocal垮线程池传递数据解决方案.docx

    在实际应用中,TransmittableThreadLocal 可以应用于各种场景,如在微服务架构中,多个微服务之间需要传递数据;在分布式系统中,多个节点之间需要传递数据等。 TransmittableThreadLocal 是一种强大的ThreadLocal...

    ThreadLocal详解及说明

    关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. 关于线程变量ThreadLocal的介绍以及说明. ...

    ThreadLocal源码分析

    首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。

    高并发之-SimpleDateFormat类的线程安全问题和解决方案.docx

    1. 使用ThreadLocal: 可以使用ThreadLocal将SimpleDateFormat对象封装在ThreadLocal中,这样每个线程都有自己的SimpleDateFormat对象,从而避免了线程安全问题。 2. 使用同步机制: 可以使用同步机制,例如...

    TestNG多线程安全吗?ThreadLocal:有我还能不安全?

    目录一、背景介绍二、TestNG多线程详解2.1 TestNG多线程实现2.2 TestNG多线程效果演示三、ThreadLocal3.1 ThreadLocal概念3.2 具体实现 一、背景介绍  在使用Selenium+TestNG做WebUI自动化过程中,为了能够加快Web...

    Java多线程编程中ThreadLocal类的用法及深入

    早在 JDK 1.2 的时代,java.lang.ThreadLocal 就诞生了,它是为了解决多线程并发问题而设计的,只不过设计得有些难用,所以至今没有得到广泛使用。其实它还是挺有用的,不相信的话,我们一起来看看这个例子吧。 一个...

    使用Java ThreadLocal.docx

    我们可以看到,通过这段代码实例化了一个ThreadLocal对象。我们只需要实例化对象一次,并且也不需要知道它是被哪个线程...即使是两个不同的线程在同一个ThreadLocal对象上设置了不同的值,他们仍然无法访问到对方的值。

Global site tag (gtag.js) - Google Analytics