当前位置: 首页 > news >正文

三种 SqlSession

三种 SqlSession

SqlSession​ 是一个接口,并且里面包含了许多 CRUD 操作数据库等方法。

SqlSession​​ 它有三个实现类,分别是 SqlSessionManager​​ 、DefaultSqlSession​​ 和 SqlSessionTemplate​​,其中 DefaultSqlSession​​ 它的默认实现类。

DefaultSqlSession 是线程不安全的 Sqlsession 。也就是说 DefaultSqlSession 不能是单例,必须是多例的。

SqlSessionManager​ 和 SqlSessionTemplate​ 是 SqlSession 的代理版,每次新建一个代理对象。姿势都是一样的,但是代理逻辑SqlSessionInterceptor 是不一样的。

代理 DefaultSqlSession 实现复用

在执行 getSqlSession 时,两则都是利用 SessionFactory 工厂创建一个 DefaultSqlSession。然后尽可能复用 DefaultSqlSession,而非多例的每次使用都创建一个 DefaultSqlSession。

SqlSession session = sessionFactory.openSession(executorType);

不同之处在于复用逻辑,先看 SqlSessionTemplate 的:

  1. SqlSessionTemplate ​会将 SqlSession 封装成 SqlSessionHolder,并有利用引用计数法,当 referenceCount>0。表示 SqlSession 还在使用。
  2. 将 sqlSessionHolder 存放到 TransactionSynchronizationManager ​的 synchronizations ​中。synchronizations ​是一个 set 集合。

相对 SqlSessionTemplate 的,SqlSessionManage 的比较简单一点。

  1. SqlSessionManage 内部有一个线程私有变量 localSqlSession。private final ThreadLocal<SqlSession> localSqlSession = new ThreadLocal();
  2. SqlSessionManage 会将 DefaultSqlSession 放入到 ThreadLocal 线程私有的变量 localSqlSession 中
  3. 用的时候先从 localSqlSession 中获取 DefaultSqlSession,如果没有获取到则创建。
SqlSessionManager 的代理逻辑
private SqlSessionManager(){this.sqlSessionProxy = (SqlSession)Proxy.newProxyInstance(SqlSessionFactory.class.getClassLoader(),new Class[]{SqlSession.class}, new SqlSessionInterceptor());
}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {SqlSession sqlSession = (SqlSession)SqlSessionManager.this.localSqlSession.get();if (sqlSession != null) {return method.invoke(sqlSession, args);} else {SqlSession autoSqlSession = SqlSessionManager.this.openSession();Object var8;try {try {Object result = method.invoke(autoSqlSession, args);autoSqlSession.commit();var8 = result;} catch (Throwable var20) {autoSqlSession.rollback();throw ExceptionUtil.unwrapThrowable(var20);}} catch (Throwable var21) {} finally {if (autoSqlSession != null) {autoSqlSession.close(); }}return var8;}
}
SqlSessionTemplate 的代理逻辑
private SqlSessionTemplate(){this.sqlSessionProxy = (SqlSession)Proxy.newProxyInstance(SqlSessionFactory.class.getClassLoader(), new Class[]{SqlSession.class}, new SqlSessionInterceptor());
}public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {SqlSession sqlSession = SqlSessionUtils.getSqlSession(SqlSessionTemplate.this.sqlSessionFactory, SqlSessionTemplate.this.executorType, SqlSessionTemplate.this.exceptionTranslator);Object unwrapped;try {Object result = method.invoke(sqlSession, args);if (!SqlSessionUtils.isSqlSessionTransactional(sqlSession, SqlSessionTemplate.this.sqlSessionFactory)) {sqlSession.commit(true);}unwrapped = result;} catch (Throwable var11) {unwrapped = ExceptionUtil.unwrapThrowable(var11);if (SqlSessionTemplate.this.exceptionTranslator != null && unwrapped instanceof PersistenceException) {SqlSessionUtils.closeSqlSession(sqlSession, SqlSessionTemplate.this.sqlSessionFactory);sqlSession = null;Throwable translated = SqlSessionTemplate.this.exceptionTranslator.translateExceptionIfPossible((PersistenceException)unwrapped);if (translated != null) {unwrapped = translated;}}throw (Throwable)unwrapped;} finally {if (sqlSession != null) {SqlSessionUtils.closeSqlSession(sqlSession, SqlSessionTemplate.this.sqlSessionFactory);}}return unwrapped;
}

http://www.lryc.cn/news/272523.html

相关文章:

  • Mybatis SQL构建器类 - 问题答案
  • React 是什么?有什么特性?有哪些优势?
  • 瑞吉外卖项目详细总结
  • Cytoscape 3.10安装包下载及安装教程
  • data.TensorDataset解析
  • 贝锐花生壳全新功能:浏览器一键远程访问SSHRDP远程桌面
  • 2024 年度 AAAI Fellows 揭晓!清华大学朱军教授入选!
  • Linux(openssl):用CA证书签名具有SAN的CSR
  • 从零开始了解大数据(七):总结
  • 增量预训练经验积累(3)
  • R语言【CoordinateCleaner】——cc_dupl():根据物种名称和坐标以及用户定义的附加列删除或标记重复的记录
  • Hadoop安装笔记1单机/伪分布式配置_Hadoop3.1.3——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项——任务2:离线数据处理
  • python数据分析之交叉验证
  • 机器人技能学习--数据集剖析
  • Jenkins的Transfers路径怎么配置,解决Transfers配置不生效的问题
  • php安装扩展event 提示 No package ‘openssl‘ found 解决方法
  • 基于SpringBoot的动物领养平台的设计与实现
  • 计算机网络期末复习——计算大题(一)
  • 2024年深度学习、计算机视觉与大模型面试题综述,六大专题数百道题目
  • 解读 $mash 通证 “Fair Launch” 规则,将公平发挥极致
  • 06、docker 安装mysql8
  • 魔改Stable Diffusion,开源创新“单目深度估计”模型
  • 使用JAVA Zookeeper构建分布式键值存储
  • 2023-12-19 LeetCode每日一题(寻找峰值 II)
  • gin框架使用系列之五——表单校验
  • HackTheBox - Medium - Linux - Interface
  • C++ 字符串操作说明 续
  • [情商-7]:如何回答没有标准答案的两难问题
  • 对偶问题的基本性质
  • Google Chrome 现在会在后台扫描泄露的密码