ThreadLocal管理Connection

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

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

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

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

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

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

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

给了解决方案:

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

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

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

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

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

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

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

 import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException; /*
* 通过ThreadLocal来管理Connection对象.
* ThreadLocal还可以管理Hibernate中的session对象,还可以管理Struts2中的dispatherFileter和Spring中的东西.
* ThreadLocal 用于每一个线程都有一个对象的副本。“以空间换时间”
* 内存泄漏?-->弱引用:WeakReference
* String str = "xxx";
*
*/ public class ConnectionManager {
private static ThreadLocal<Connection> threadLocal = new ThreadLocal<Connection>(); private ConnectionManager(){} public static Connection getInstance(){
try {
Connection conn = threadLocal.get();
if(conn == null){
conn = DriverManager.getConnection("");//获取数据库连接对象
threadLocal.set(conn);
}
return conn;
} catch (SQLException e) {
e.printStackTrace();
}
return null;
} }

ThreadLocal管理Connection的更多相关文章

  1. 转账示例(四):service层面实现(线程管理Connection,AOP思想,动态代理)(本例采用QueryRunner来执行sql语句,数据源为C3P0)

    用了AOP(面向切面编程),实现动态代理,service层面隐藏了开启事务.1.自行创建C3P0Uti,account数据库,导入Jar包 2.Dao层面 接口: package com.learni ...

  2. 转账示例(三):service层面实现(线程管理Connection)(本例采用QueryRunner来执行sql语句,数据源为C3P0)

    缺点:Service层面还是不应该出现关于事务的操作1.自行创建C3P0Uti,account数据库,导入Jar包 2.Dao层面 接口: package com.learning.dao; impo ...

  3. java笔记--用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程

    用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程 ThreadLocal在我的笔记"关于线程同步"的第5种方式里面有介绍,这里就不多说了. ...

  4. ThreadLocal管理登录信息

    通常在项目中,用户登录后,我们会将用户的信息存到session,如果想在其它地方获取session中的用户信息,我们需要先获取HttpServletRequest,再通过request.getSess ...

  5. 【java项目实战】ThreadLocal封装Connection,实现同一线程共享资源

    线程安全一直是程序员们关注的焦点.多线程也一直是比較让人头疼的话题,想必大家以前也遇到过各种各种的问题.我就不再累述了.当然,解决方案也有非常多,这篇博文给大家提供一种非常好的解决线程安全问题的思路. ...

  6. 用ThreadLocal管理事务

    1.适用场景 一个service,操作两个dao,要求两个dao为同一个事务,要么全成功,要么全失败.

  7. [转]利于ThreadLocal管理Hibernate Session

    摘自http://aladdin.iteye.com/blog/40986 在利用Hibernate开发DAO模块时,我们和Session打的交道最多,所以如何合理的管理Session,避免Sessi ...

  8. JDBC事务(三)ThreadLocal绑定Connection

    处理一个请求即开启一个线程,在三层中,执行三层中的方法都是用的同一个线程. 我们开启一个事务,使用conn.setAutoCommit(false); conn应该属于ado层,不应该出现在servi ...

  9. 利用ThreadLocal管理事务

    package com.itheima.util; import java.sql.Connection; import java.sql.SQLException; //封装了所有与事务有关的方法 ...

随机推荐

  1. maven使用中遇到的问题

    一>手动将jar包安装到仓库的命令示例: 首先:编写命令:mvn install:install-file -Dfile=D:\lucene-highlighter-4.10.2.jar -Dg ...

  2. 微信小程序之基础入门

    微信小程序有几个基础的文件:js(JavaScript逻辑代码),json(页面配置),wxml(类似hthml布局),wxss(css样式) 我们使用app.json文件来对微信小程序进行全局配置, ...

  3. 11-border(边框)

    边框 border:边框的意思,描述盒子的边框 边框有三个要素: 粗细 线性样式 颜色 border: solid 如果颜色不写,默认是黑色.如果粗细不写,不显示边框.如果只写线性样式,默认的有上下左 ...

  4. The file left unchanged.

    This files have types: *.___jb_old___ and *.___jb_bak___ The file left unchanged. You can disable &q ...

  5. C++语言定义的标准转换

    标准转换 C++ 语言定义其基础类型之间的转换. 它还定义指针.引用和指向成员的指针派生类型的转换. 这些转换称为“标准转换. 1. 整型提升 整数类型的对象可以转换为另一个更宽的整数类型(即,可表示 ...

  6. OpenGL中的渐变颜色绘图(应力可视化)

    #include <GL/glut.h> #include <iostream> #include <cmath> using namespace std; ; ; ...

  7. Mysql 分区(range,list,hash)转载

    MySQL支持RANGE,LIST,HASH和KEY四种分区.其中,每个分区又都有一种特殊的类型.对于RANGE分区,有RANGE COLUMNS分区.对于LIST分区,有LIST COLUMNS分区 ...

  8. cxgrid动态生成footersummary 并获得值

    cxgrid动态生成footersummary 并获得值   var f: TcxGridDBTableSummaryItem; cx_for_mctv.OptionsView.Footer := t ...

  9. WPF学习笔记(5):两个DataGrid的滚动条实现同步滚动

    效果:两个DataGrid的滚动条实现同步滚动. 代码参考了博客园chuncn的文章<.net中同步多个ScrollViewer滚动的四种方法>,原文是针对ListBox的.现改为针对Da ...

  10. wpf 水波进度条 用户控件

    之前看公司web前端做了个 圆形的水波纹 进度条,就想用wpf 做一个,奈何自己太菜 一直做不出来,在看过 “普通的地球人” 的 “ WPF实现三星手机充电界面 博客之后 我也来照葫芦画个瓢. 废话不 ...