- 小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
一、什么是ThreadLocal?
定义: ThreadLocal是一个可以开箱即用、无额外开销、线程安全的工具类
来源: 每个线程内部有一个自己的ThreadLocalMap的引用,每个线程从自己的threadlocalMap中获取threadlocal。 每个threadlocal变量作为key,对应线程专属的值为value。
特点:
1.线程持有
一次web请求中,只会使用同一个线程。
2.线程一致
在jdbc中保证一个事务所有数据都在一个连接里。
3.线程安全
,ThreadLocal收集错误信息,在多线程处理场景下,可供后续的链路去使用这个值,保证安全。
二、使用类
1.SqlSessionFactoryBuilder
该对象主要负责读取mybatis的主配置文件(mybatis-Config.xml),用于指定数据库的连接参数和框架参数配置
2.SqlSessionFactory
每一个mybatis的应用程序都有一个SqlSessionFactory对象,该对象负责创建SqlSession
3.SqlSession
该对象包含了所有执行sql操作的方法
- 附上mybatis工具类源码
public class MybatisUtil {
static ThreadLocal<SqlSession> tl = new ThreadLocal<SqlSession>();
private static SqlSessionFactory factory;
static {
try {
factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("mybatis-Config.xml"));
} catch (IOException e) {
e.printStackTrace();
}
}
//获取sqlSession
public static SqlSession getSession() {
//优先从threadLocal中获取session对象
SqlSession session = tl.get();
//如果session为空,则创建新的session对象,并保存到threadLocal中
if (session == null) {
session = factory.openSession();
tl.set(session);
}
return session;
}
//事务提交
public static void commit() {
SqlSession session = tl.get();
if (session != null) {
session.commit();
//关闭
close();
}
}
//事务回滚
public static void rollback() {
SqlSession session = tl.get();
if (session != null) {
session.rollback();
//关闭
close();
}
}
//关闭sqlSessiojn
public static void close() {
SqlSession session = tl.get();
if (session != null) {
session.close();
//关闭
tl.remove();
}
}
}