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


相关推荐

  • oracle sysdate毫秒,Oracle sysdate常用「建议收藏」

    oracle sysdate毫秒,Oracle sysdate常用「建议收藏」SELECT*FROM(SELECT*FROMcalenderDetailAORDERBYa.calenderdesc)WHERErownum<3;//计算时间大于当前时间的最近2条记录取当前小时,以及相隔一小时v_begin_date:=to_date(to_char(sysdate,‘yyyy-mm-ddhh24‘),‘yyyy-mm-ddhh24‘);…

    2022年10月24日
    0
  • jenkins自定义构建参数_jenkins怎么构建项目

    jenkins自定义构建参数_jenkins怎么构建项目前言当我们的自动化项目越来越多的时候,在代码仓库会提交不同的分支来管理,在用jenkins来构建的时候,我们希望能通过参数化构建git仓库的分支。下载安装GitParameter插件系统管理-

    2022年7月28日
    5
  • 华为交换机关闭网口_华为交换机关闭端口号[通俗易懂]

    华为交换机关闭网口_华为交换机关闭端口号[通俗易懂]华为交换机为VLAN使用中某端口的关闭(在线等啊!!!!急)这里交换机是通过动作来保护非法接入,比如:当一台交换机端口进行mac绑定后,则只允许该mac的PC上网,如果发现其他的mac出现在这个端口上,交换机会认为这个端口被非法接入了,这时就会执行了设置好的一个安全保护动作。默认的这个动作是shutdown,你很可能就是端口被自动shutdown了华为交换机关闭135端口答:通过displayv…

    2022年7月20日
    33
  • 主成分分析与因子分析及SPSS实现[通俗易懂]

    主成分分析与因子分析及SPSS实现[通俗易懂]主成分分析与因子分析及SPSS实现一、主成分分析(1)问题提出在问题研究中,为了不遗漏和准确起见,往往会面面俱到,取得大量的指标来进行分析。比如为了研究某种疾病的影响因素,我们可能会收集患者的人口学资料、病史、体征、化验检查等等数十项指标。如果将这些指标直接纳入多元统计分析,不仅会使模型变得复杂不稳定,而且还有可能因为变量之间的多重共线性引起较大的误差。有没有一种办法能对信息进行浓缩,减少变量的个…

    2022年5月17日
    42
  • 为UWP应用开启回环访问权限「建议收藏」

    为UWP应用开启回环访问权限

    2022年3月13日
    179
  • 服务器异地灾备_华为idc解决方案

    服务器异地灾备_华为idc解决方案说明两地三中心:两地是指同城、异地三中心是指生产中心、同城容灾中心、异地容灾中心。备端在线两地三中心灾备方案网络设计如下:容灾系统衡量指标衡量容灾系统的主要指标有RPO(RecoveryPointObject):灾难发生时允许丢失的数据量RTO(RecoveryTimeObjective):系统恢复的时间容灾半径:生产系统和容灾系统之间的距离ROI(R…

    2022年4月20日
    186

发表回复

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

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