1. 什么是ThreadLocal?
1.1 源码中的解释
可以这样理解:
ThreadLocal提供了线程的局部变量,每个线程都可以通过set()和get()来对这个局部变量进行操作,但不会和其他线程的局部变量进行冲突,实现了线程的数据隔离~。
简要言之:往ThreadLocal中填充的变量属于当前线程,该变量对其他线程而言是隔离的
2. 用处
ThreadLocal能够实现当前线程的操作都是用同一个Connection,保证了事务!
2.1 具体代码:
最典型的是管理数据库的Connection:为了方便操作写了一个简单数据库连接池,需要数据库连接池的理由也很简单,频繁创建和关闭Connection是一件非常耗费资源的操作,因此需要创建数据库连接池~
package com.muluo.util;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
import java.io.InputStream;
public class SqlSessionUtil {
// 构造器私有化,就不能new对象,可以用类名直接调用
private SqlSessionUtil(){}
private static SqlSessionFactory sqlSessionFactory;
static {
String resource = "mybatis-config.xml";
InputStream inputStream = null;
try {
inputStream = Resources.getResourceAsStream(resource);
} catch (IOException e) {
e.printStackTrace();
}
sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
}
private static ThreadLocal<SqlSession> t = new ThreadLocal<SqlSession>();
//取得SqlSession对象
public static SqlSession getSession(){
SqlSession session = t.get();
if(session==null){
session = sqlSessionFactory.openSession();
y
t.set(session);
}
return session;
}
//关闭SqlSession对象
public static void myClose(SqlSession session){
if(session!=null){
session.close();
//这句必须加,非常容易忘
t.remove();
}
}
}