MyBatis - ThreadLocal<SqlSession>

简介: MyBatis - ThreadLocal<SqlSession>

为什么使用TreadLocal来实现?

当使用ThreadLocal维护变量时,ThreadLocal为每个使用该变量的线程提供独立的变量副本,所以每一个线程都可以独立地改变自己的副本,而不会影响其它线程所对应的副本。 下面以 Hibernate 中的 session(相当于MyBatis中的 SqlSession)来示范。


创建类 SessionUtil.java

importorg.hibernate.Session;
importorg.hibernate.SessionFactory;
importorg.hibernate.cfg.Configuration;
publicclassSessionUtil {
privatestaticSessionFactoryfactory;
privatestaticThreadLocal<Session>threadLocal=newThreadLocal<Session>();
// 静态初始化块,加载配置信息,获取SessionFactorystatic {
// 读取hibernate.cfg.xml文件Configurationcfg=newConfiguration().configure();
// 建立SessionFactoryfactory=cfg.buildSessionFactory();
    }
publicstaticSessiongetSession() {
//获取当前线程下的sessionSessionsession=threadLocal.get();
//如果session为null,则从SessionFactory中获取一个session放入ThreadLocalif(session==null) {
System.out.println("session is null!");
session=factory.openSession();
threadLocal.set(session);
        }
returnsession;
    }
publicstaticvoidcloseSession() {
Sessionsession=threadLocal.get();
//如果session不为null,则关闭session,并清空ThreadLocalif(session!=null) {
session.close();
threadLocal.set(null);
        }
    }
}

创建 MyThread.java 并继承 Thread

importorg.hibernate.Session;
publicclassMyThreadextendsThread{
@Overridepublicvoidrun() {
Sessionsession1=SessionUtil.getSession();
Sessionsession2=SessionUtil.getSession();
Sessionsession3=SessionUtil.getSession();
//获取线程idlongthreadId=this.getId(); 
//输出session的hashCode,分辨是否是同一个session实例System.out.println("线程"+threadId+":\n"+session1.hashCode() +"\n"+session2.hashCode() +"\n"+session3.hashCode());
    }
}

创建 Test.java

publicclassTest {
publicstaticvoidmain(String[] args) {
MyThreadthread1=newMyThread();
MyThreadthread2=newMyThread();
MyThreadthread3=newMyThread();
//启动线程thread1.start();
thread2.start();
thread3.start();
    }
}

结果截图:

image.png

附:

image.png

结论

  • 从结果中的 hashCode 可以看出,每条线程都有属于自己的一个 session 实例。
目录
相关文章
|
1月前
|
SQL Java 数据库连接
MyBatis之魂:探索核心接口SqlSession的神秘力量
MyBatis之魂:探索核心接口SqlSession的神秘力量
28 3
MyBatis之魂:探索核心接口SqlSession的神秘力量
|
3月前
|
SQL Java 数据库连接
一篇看懂Mybatis的SqlSession运行原理
SqlSession是Mybatis最重要的构建之一,可以简单的认为Mybatis一系列的配置目的是生成类似 JDBC生成的Connection对象的SqlSession对象,这样才能与数据库开启“沟通”,通过SqlSession可以实现增删改查(当然现在更加推荐是使用Mapper接口形式),那么它是如何执行实现的,这就是本篇博文所介绍的东西,其中会涉及到简单的源码讲解。
42 1
|
4月前
|
XML Java 数据库连接
Mybatis之简介、使用操作(安装、XML、SqlSession、映射的SQL语句、命名空间、作用域和生命周期)
【1月更文挑战第2天】 MyBatis 是一款优秀的持久层框架 MyBatis 避免了几乎所有的 JDBC 代码和手动设置参数以及获取结果集的过程 MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 实体类 【Plain Old Java Objects,普通的 Java对象】映射成数据库中的记录。
113 2
Mybatis之简介、使用操作(安装、XML、SqlSession、映射的SQL语句、命名空间、作用域和生命周期)
|
4月前
|
缓存 Java 数据库连接
一文彻底搞懂Mybatis系列(十)之SqlSession、SqlSessionFactory和SqlSessionFactoryBuilder详解
一文彻底搞懂Mybatis系列(十)之SqlSession、SqlSessionFactory和SqlSessionFactoryBuilder详解
427 1
|
9月前
|
SQL 缓存 Java
MyBatis核心 - SqlSession如何通过Mapper接口生成Mapper对象
从 SqlSessionFactoryBuilder - SqlSessionFactory - SqlSession - Mapeper实例对象 的过程
103 0
|
5月前
|
设计模式 缓存 Java
MyBatis原理分析之获取SqlSession
MyBatis原理分析之获取SqlSession
107 0
|
6月前
|
SQL XML Java
Mybatis插入大量数据效率对比:foreach、SqlSession批量、sql
使用mybatis插入数据执行效率对比,对比三种方式(测试数据库为MySQL), 使用 SqlSessionFactory,每一批数据执行一次提交 使用mybatis-plus框架的insert方法,for循环,每次执行一次插入 使用ibatis,纯sql插入
|
9月前
|
Java 数据库连接 mybatis
Mybatis之Error building SqlSession.
Mybatis之Error building SqlSession.
358 0
|
12月前
|
XML SQL 安全
MyBatis相关API、Resources、SqlSessionFactoryBuilder、SqlSessionFactory及SqlSession
MyBatis相关API、Resources、SqlSessionFactoryBuilder、SqlSessionFactory及SqlSession
57 0
|
12月前
|
SQL Java 数据库连接
MyBatis源码- SqlSession门面模式 & selectList 源码解析
MyBatis源码- SqlSession门面模式 & selectList 源码解析
55 0