ThreadLocal管理Connection
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的更多相关文章
- 转账示例(四):service层面实现(线程管理Connection,AOP思想,动态代理)(本例采用QueryRunner来执行sql语句,数据源为C3P0)
用了AOP(面向切面编程),实现动态代理,service层面隐藏了开启事务.1.自行创建C3P0Uti,account数据库,导入Jar包 2.Dao层面 接口: package com.learni ...
- 转账示例(三):service层面实现(线程管理Connection)(本例采用QueryRunner来执行sql语句,数据源为C3P0)
缺点:Service层面还是不应该出现关于事务的操作1.自行创建C3P0Uti,account数据库,导入Jar包 2.Dao层面 接口: package com.learning.dao; impo ...
- java笔记--用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程
用ThreadLocal管理线程,Callable<V>接口实现有返回值的线程 ThreadLocal在我的笔记"关于线程同步"的第5种方式里面有介绍,这里就不多说了. ...
- ThreadLocal管理登录信息
通常在项目中,用户登录后,我们会将用户的信息存到session,如果想在其它地方获取session中的用户信息,我们需要先获取HttpServletRequest,再通过request.getSess ...
- 【java项目实战】ThreadLocal封装Connection,实现同一线程共享资源
线程安全一直是程序员们关注的焦点.多线程也一直是比較让人头疼的话题,想必大家以前也遇到过各种各种的问题.我就不再累述了.当然,解决方案也有非常多,这篇博文给大家提供一种非常好的解决线程安全问题的思路. ...
- 用ThreadLocal管理事务
1.适用场景 一个service,操作两个dao,要求两个dao为同一个事务,要么全成功,要么全失败.
- [转]利于ThreadLocal管理Hibernate Session
摘自http://aladdin.iteye.com/blog/40986 在利用Hibernate开发DAO模块时,我们和Session打的交道最多,所以如何合理的管理Session,避免Sessi ...
- JDBC事务(三)ThreadLocal绑定Connection
处理一个请求即开启一个线程,在三层中,执行三层中的方法都是用的同一个线程. 我们开启一个事务,使用conn.setAutoCommit(false); conn应该属于ado层,不应该出现在servi ...
- 利用ThreadLocal管理事务
package com.itheima.util; import java.sql.Connection; import java.sql.SQLException; //封装了所有与事务有关的方法 ...
随机推荐
- python 基础_列表的其他操作 4
一.查找某个元素在数组中出现的次数 ,count的运用 a = ['a','b','c','c','c','a'] print(a.count('c')) 二.把一个元素插入到另一个元素的末尾,ext ...
- 百度Web Uploader组件实现文件上传(一)
Web Uploader WebUploader是由Baidu WebFE(FEX)团队开发的一个简单的以HTML5为主,FLASH为辅的现代文件上传组件.在现代的浏览器里面能充分发挥HTML5的优势 ...
- php 大文件上传的实现
最近公司做工程项目,实现大文件上传 网上找了很久,发现网上很多代码大都存在很多问题,不过还是让我找到了一个符合要求的项目. 工程: 对项目的文件上传功能做出分析,找出文件上传的原理,对文件的传输模式深 ...
- 防火墙内JVisualVM连接jstatd解决方案
jstatd启动后会打开两个端口,其中一个端口可通过参数“-p”指定,如果不指定默认为1099,另一个是一个随机端口,不能参数指定: # netstat -lpnt|grep jstatd tcp ...
- Redis模块开发示例
实现一个Redis module,支持两个扩展命令: 1) 可同时对hash的多个field进行incr操作: 2) incrby同时设置一个key的过期时间 在没有module之前,需要借助eval ...
- DML DDL
DDL 1.SQL分为5大类: DDL:数据定义语言 DCL:数据控制语言 DML:数据操纵语言 DTL:数据事务语言 DQL:数据查询语言 2.DDL(data definition languag ...
- (拓扑)确定比赛名次 -- hdu -- 1285
http://acm.hdu.edu.cn/showproblem.php?pid=1285 确定比赛名次 Time Limit: 2000/1000 MS (Java/Others) Memo ...
- Android webview 退出时关闭声音 4.视频全屏 添加cookie
全屏问题,可以参考 http://bbs.csdn.net/topics/390839259,点击 webView = (WebView) findViewById(R.id.webView); vi ...
- Android多线程操作sqlite(Sqlite解决database locked问题)(2)使用事务处理的效果
问题场景描述: 在页面中用到了ViewPager控件,ViewPager中的内容分别是两个ListView,两个ListView的数据都来自本地数据库(先从网络下载数据,然后更新本地数据库),在实际的 ...
- FastReport
看下面 https://www.cnblogs.com/m0488/category/477792.html