ThreadLocal管理Connection

每一个用户都对应有一个单独线程,每一个线程都有一个数据库连接对象Connection对象接待它.

一个用户对应一个线程,这个线程中的Connection对象或者数据库连接对象是唯一的,且只能有一个.

怎么去获得这个数据库连接对象?(看下面的代码)

ThreadLocal还可以管理Hibernate中的session对象,还可以管理Struts2中的dispatherFileter和Spring中的东西.

每个线程都有一个独立的副本,这样会存在一个小问题.

如果线程特别多,对象特别大的话.这个时候会造成内存占用的比较大,内存泄露的问题.(这是一个非常严重的问题)

ThreadLocal 用于每一个线程都有一个对象的副本。“以空间换时间”

给了解决方案:

源码中继承了一个WeakReference类,弱引用.通过这个类解决了可能造成的内存泄露的问题.

一般的类,如果不继承WeakReference这个类,都是强引用的.

强引用比如说: String str = "xxx";  str被xxx引用着,如果引用不消失.

即使这个引用没有工作了,他们就一直会占用着内存.垃圾回收无法把他们回收掉.

如果是弱引用的,即使它饮用着,如果它不工作了...垃圾回收照样会把它们回收.

这就是ThreadLocal的解决内存泄露的问题.

但是仍然建议你使用ThreadLocal类中的remove()方法手动的移除掉.

 2
 3 import java.sql.Connection;
 4 import java.sql.DriverManager;
 5 import java.sql.SQLException;
 6
 7
 8 /*
 9  * 通过ThreadLocal来管理Connection对象.
10  * ThreadLocal还可以管理Hibernate中的session对象,还可以管理Struts2中的dispatherFileter和Spring中的东西.
11  * ThreadLocal 用于每一个线程都有一个对象的副本。“以空间换时间”
12  * 内存泄漏?-->弱引用:WeakReference
13  * String str = "xxx";
14  *
15  */
16
17 public class ConnectionManager {
18     private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>();
19
20     private ConnectionManager(){}
21
22     public static Connection getInstance(){
23         try {
24             Connection conn = threadLocal.get();
25             if(conn == null){
26                 conn = DriverManager.getConnection("");//获取数据库连接对象
27                 threadLocal.set(conn);
28             }
29             return conn;
30         } catch (SQLException e) {
31             e.printStackTrace();
32         }
33         return null;
34     }
35
36 }

ThreadLocal管理Connection相关推荐

  1. 小白学习spring第二天

    第8节:Spring配置文件模块化 1.配置文件模块化的业务背景,为什么要进行配置文件模块化2.配置文件模块化的具体实现方式一: 创建多个并列的配置文件方式二: 创建一个主配置,多个从配置,主配置当中 ...

  2. Spring JDBC-Spring事务管理之ThreadLocal基础知识

    文章目录 概述 ThreadLocal是什么 ThreadLocal的接口方法 ThreadLocal示例 与Thread同步机制的比较 Spring中使用ThreadLocal解决线程安全问题 概述 ...

  3. 5G 信令流程 — 5GC 的连接管理(CM,Connection Management)

    目录 文章目录 目录 5GC 的连接管理 连接管理的状态模型 CM 状态模型 RRC Inactive 状态模型 CM-IDLE 切换到 CM-Connected 流程(RRC.N2 连接建立流程) ...

  4. 什么是ThreadLocal

    顾名思义它是local variable(线程局部变量).它的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突.从线 ...

  5. (转)Spring中ThreadLocal的认识

    我们知道Spring通过各种DAO模板类降低了开发者使用各种数据持久技术的难度.这些模板类都是线程安全的,也就是说,多个DAO可以复用同一个模板实例而不会发生冲突.我们使用模板类访问底层数据,根据持久 ...

  6. spring线程并发处理(ThreadLocal)

    我们知道Spring通过各种DAO模板类降低了开发者使用各种数据持久技术的难度.这些模板类都是线程安全的,也就是说,多个DAO可以复用同一个模板实例而不会发生冲突. 我们使用模板类访问底层数据,根据持 ...

  7. ThreadLocal 和 InheritableThreadLocal

    在学习ThreadLocal之前,建议先了解Java中的4种引用 一.先看一下Thread,ThreadMap,ThreadLocal的关系 Thread中持有一个ThreadLocalMap ,这里 ...

  8. JUC多线程:ThreadLocal 原理总结

    1.什么是 ThreadLocal: ThreadLocal 提供了线程内部的局部变量,当在多线程环境中使用 ThreadLocal 维护变量时,会为每个线程生成该变量的副本,每个线程只操作自己线程中 ...

  9. Java并发编程—ThreadLocal底层原理

    作者:Java3y 链接:https://www.zhihu.com/question/341005993/answer/793627819 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权, ...

最新文章

  1. PHP HashTable总结
  2. 【django】项目开发准备【1】
  3. 小程序 const moment = require('moment')_开源小程序精选
  4. 热烈祝贺我刊主编郑纬民教授被提名为中国工程院2017年院士增选候选人!
  5. Jenkins之Log Parse的使用
  6. linux 添加新用户时常用的操作
  7. 1亿中国人已被AI批改过作业
  8. 程序员高效学习,坚持十年就是大师
  9. LeetCode - Duplicate Emails
  10. 基于java网上商城源码设计
  11. 联想ts250进bios_联想Think TS250/TS550安装server 2008 R2/2012系统教程【一】
  12. SPI通信协议以及概念
  13. TCP/UDP 协议格式
  14. python報錯: OSError: Unable to locate Ghostscript on paths
  15. windows 7可用软件搜索贴~(转)(申请置顶)
  16. 对Android初学者学习中的几点建议
  17. SAP 采购合同案例教程金额合同前台
  18. 局域网与城域网(1)(网工)
  19. 冷库用电量计算机方式,冷库一般用电量如何估算
  20. 2个月获得职业技能大赛省赛银牌?!

热门文章

  1. #ps –ef_常用Linux中ps命令学习及ps aux与ps -ef的区别
  2. css使两个盒子并列_css如何去掉重叠部分的边框?
  3. matlab向量的角标,【MATLAB】利用冒号表达式获得子矩阵
  4. oracle描述dept,一些关于oracle驱动表的描述
  5. mysql查询结果导出excel_Mysql查询结果导出为Excel的几种方法
  6. django 开发中数据库可以怎样优化
  7. Flask设置、获取、删除cookies
  8. (3) Hibernate的查询 标准(Criteria)查询
  9. mysql集群搭建教程-mysql+windows篇
  10. android两个耳机能连两部手机吗,AirPods使用技巧:如何让耳机同时连接两台手机...