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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 蜗牛星际NAS安装黑群晖V6.2.1+洗白+免U盘引导启动

    蜗牛星际NAS安装黑群晖V6.2.1+洗白+免U盘引导启动推上看到有dalao分享蜗牛星际的车,作为伪“资深垃圾佬”自然不能错过,于是去咸鱼上收了一台。基本配置如下(性价比相当高):4盘位机箱+J1900处理器+4GRAM+16GMSATASSD+150W电源其中,我购买的是A款(带防尘罩),机箱背部为两个USB3.0接口与一个RJ45接口,主板为绿色,网卡inteli211,也是目前翻车最少的版本(双网口翻车严重…

    2022年6月4日
    1.1K
  • k8s(二)搭建「建议收藏」

    k8s(二)搭建「建议收藏」k8s安装 初始化环境kubernetes必要组件安装集群安装一主多从多主多从安装 初始化环境minibuke 用于快速构建单节点k8s的工具kubeadm 用于快速搭建k8s集群的工具二进制包 从官网下载每个组件的二进制包 一次去安装 对于理解k8s更有效作用nathostmaster10.0.3.11192.168.56.101node110.0.3.12192.168.56.102node210.0.3.14192.168.56.1

    2022年8月9日
    8
  • 在ubuntu系统下安装python

    在ubuntu系统下安装python

    2021年10月6日
    39
  • 软件测试基础知识大全_软件测试主要学的内容有哪些

    软件测试基础知识大全_软件测试主要学的内容有哪些一、软件测试概述1、软件缺陷软件缺陷:又称之为“Bug”。即计算机软件或程序中存在的某种破坏正常运行能力的问题、错误,或者隐藏的功能缺陷。缺陷的表现形式:软件没有实现产品规格说明书所要求的功能模块;软件中出现了产品规格说明指明不应该出现的错误;软件实现了产品规格说明中没有提到的功能需求;软件没有实现虽然产品规格说明没有明确提及但应该实现的目标;软件难以理解、不易使用、运行缓慢、用户体验不友好;产生软件缺陷的原因:需求不清晰;系统结构较为复杂;对程序逻辑路径或者数据范围考虑不全面

    2022年9月27日
    15
  • 【原】XNA3.1发布,视频播放功能初探

    【原】XNA3.1发布,视频播放功能初探6月11日XNA3.1发布,新增了视频播放功能,来看看吧。

    2022年7月2日
    29
  • JAVA的垃圾回收机制_java的内存回收机制

    JAVA的垃圾回收机制_java的内存回收机制一:垃圾回收机制的意义java语言中一个显著的特点就是引入了java回收机制,是c++程序员最头疼的内存管理的问题迎刃而解,它使得java程序员在编写程序的时候不在考虑内存管理。由于有个垃圾回收机制,java中的额对象不在有“作用域”的概念,只有对象的引用才有“作用域”。垃圾回收可以有效的防止内存泄露,有效的使用空闲的内存;内存泄露:指该内存空间使用完毕后未回收,在不涉及复杂数据结构的一般…

    2022年10月10日
    4

发表回复

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

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