jdbc中用ThreadLocal 进行内存优化

jdbc中用ThreadLocal 进行内存优化

目录

使用事务控制完成业务功能

ThreadLocald的常见使用场景

ThreadLocal其他几个注意的点

工具类的升级

用ThreadLocal之前与之后对比

1、之前:

 2、之后


 

使用事务控制完成业务功能

目的:在一个线程的各段代码中,只使用一个连接Conn

ThreadLocal功能:为同一个线程保存同一个值,为不同线程保存不同的值.

创建ThreadLocal对象,ThreadLocal<T> tdl = new ThreadLocal<T> ();

常用方法有:

jdbc中用ThreadLocal 进行内存优化

 测试代码如下:

package jdbc;

public class TestThreadLocal {
	public static void main(String[] args) throws Exception  {
		//tl对象可以为同一个线程保存相同的值,为不同线程保存不同的值.
		final ThreadLocal<String> tl = new ThreadLocal<String>();
	
 				Thread t1 = new Thread() {
			public void run() {
				tl.set("hello");
				System.out.println("t1:" + tl.get());
			}
		};
		t1.start();
		Thread.sleep(1000);
		Thread t2 = new  Thread(){
			public void run() {
				tl.set("world");
				System.out.println("t2:"+tl.get());
			}
		};
		t2.start();
	}
}

输出结果为:jdbc中用ThreadLocal 进行内存优化

ThreadLocald的常见使用场景

1、在进行对象跨层传递的时候,使用ThreadLocal可以避免多次传递,打破层次间的约束。

2、线程间数据隔离

3、进行事务操作,用于存储线程事务信息。

4、数据库连接,Session会话管理。

 

ThreadLocal其他几个注意的点

只要是介绍ThreadLocal的文章都会帮大家认识一个点,那就是内存泄漏问题。我们先来看下面这张图。

jdbc中用ThreadLocal 进行内存优化

 

上面这张图详细的揭示了ThreadLocal和Thread以及ThreadLocalMap三者的关系。

1、Thread中有一个map,就是ThreadLocalMap

2、ThreadLocalMap的key是ThreadLocal,值是我们自己设定的。

3、ThreadLocal是一个弱引用,当为null时,会被当成垃圾回收

4、重点来了,突然我们ThreadLocal是null了,也就是要被垃圾回收器回收了,但是此时我们的ThreadLocalMap生命周期和Thread的一样,它不会回收,这时候就出现了一个现象。那就是ThreadLocalMap的key没了,但是value还在,这就造成了内存泄漏。

解决办法:使用完ThreadLocal后,执行remove操作,避免出现内存溢出情况。

工具类的升级

好吧,接下来就对,工具类进行升级了,重点是通过ThreadLocal对Connection连接进行优化

package util;

import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
/*
 * jdbc工具类
 * 1:properties配置文件 封装获取连接,释放资源,提高代码复用性
 * 2:类加载时加载驱动
 * 3:Threadlocal控制事务
 * */
public class jdbcUtil2 {
		//创建properties
		 static Properties  pro =  new Properties();
		 //创建Thread	local<Connection>,可以为同一个线程保存同一个连接,为不同线程保存不同的连接
		 private static ThreadLocal<Connection> tl = new ThreadLocal<Connection>();
		 
		 //加载驱动
		 static{
			InputStream is = null;
			try {
				is = jdbcUtil.class.getResourceAsStream("/conf/db.properties");
				pro.load(is);
				
				Class.forName(pro.getProperty("driverClassName"));
			} catch (Exception e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} 	
			finally{
				try {
					is.close();
				} catch (IOException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}
		}
		//获取连接
		public static  Connection getConnection() throws Exception{
			Connection conn = tl.get();//获得当前线程中的连接
			if(conn == null){//如果当前线程中没有连接
				String url = pro.getProperty("url");
				String user = "root";
				String password = "root123";	
				//创建连接
			    conn = DriverManager.getConnection(url, user, password);
			    //将连接保存到当前线程
			    tl.set(conn);
			}
			return conn;	
		}
		//释放资源/关闭连接
		public static void release(ResultSet rs,PreparedStatement psm,Connection conn) throws SQLException{
			if(rs!=null){
				rs.close();
			}
			if(psm!=null){
				psm.close();
			}
			if(conn!=null){
				conn.close();
				tl.remove();//将连接从当前线程中移出
			}	
		}
}

用ThreadLocal之前与之后对比

之前:

 

jdbc中用ThreadLocal 进行内存优化

 之后

jdbc中用ThreadLocal 进行内存优化

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/114779.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • viper4android脉冲样本,V4A脉冲反馈样本第一弹 爽爆「建议收藏」

    煤油,积分3926,距离下一级还需1074积分NFS_359|煤油煤油,积分3926,距离下一级还需1074积分|6电梯直达发表于2015-1-218:14:34|只看楼主|只看大图|倒序浏览|阅读模式|收藏本帖NFS_359|煤油煤油,积分3926,距离下一级还需1074积分主题:19|帖子:1016|积分:3926该用户从未签到当前离线本帖最后由…

    2022年4月17日
    192
  • java snmp协议_snmp属于哪一层协议

    java snmp协议_snmp属于哪一层协议背景控制华为交换机的poe供电与断电来重启PADsnmp协议使用importjava.io.IOException;importjava.util.ArrayList;importjava.util.List;importjava.util.Vector;importlombok.extern.slf4j.Slf4j;importorg.snmp4j.CommunityTarget;importorg.snmp4j.PDU;importorg.snmp4j.Snmp;

    2022年10月16日
    0
  • rpc接口测试方法_rpc服务接口测试

    rpc接口测试方法_rpc服务接口测试一、项目需求开发文档已明确要压测的接口是rpc接口,并给出了rpc接口和依赖,如下:RPC接口:<dependency><groupId>com.xueqiu.snowflake</groupId><artifactId>usercenter-client</artifactId><version>2.13.5</version></dependency>调用示例:List&

    2022年10月13日
    0
  • 整数规划matlab实例,整数规划matlab[通俗易懂]

    整数规划matlab实例,整数规划matlab[通俗易懂]整数规划matlabTag内容描述:1、例已知非线性整数规划为maxz=x12+x22+3×32+4×42+2×52-8×1-2×2-3×3-x4-2x5s.t.0xi99,i=1,2,5×1+x2+x3+x4+x5400x1+2×2+2×3+x4+6x58002x1+x2+6x3200x3+x4+5×5200(1)编写M文件mengte.m,定义目标函数f和约束向量函数g,程序如下:funct…

    2022年7月12日
    18
  • python怎样安装whl文件

    python怎样安装whl文件python第三方组件有很多都是whl文件,遇到这样的whl文件应该怎样安装呢,今天来介绍一下whl文件怎样安装。(一)下载whl文件可以从下面;两个网站找到自己需要的whl文件,部分文件在国内网站上没有,pypi网站上是最全的。pypi网站:https://pypi.python.org/pypi/国内whl集合网:https://www.l…

    2022年4月5日
    108
  • 监控录像数据恢复方法步骤详解

    监控录像数据恢复方法步骤详解在人们生活日益改善的今天,社会的和谐安定成为了最为重要的一个问题。一些不法分子为了一己私利,通过不法手段谋取他人的财物。这样的行为对社会对个人都是一种威胁,为了能更好的防治这类社会危害因素,那就需要我们的电子警察——视频监控出马了。视频监控在现在生活中随处可见,道路上有治安监控,各家商铺有防盗监控,随处可见的监控给人们的生命财产安全带来了一份保障。利用安全防范技术进行安全防范首先对犯罪分子

    2022年5月4日
    273

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号