三种 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 的:
SqlSessionTemplate
会将 SqlSession 封装成 SqlSessionHolder,并有利用引用计数法,当 referenceCount>0。表示 SqlSession 还在使用。- 将 sqlSessionHolder 存放到
TransactionSynchronizationManager
的synchronizations
中。synchronizations
是一个 set 集合。
相对 SqlSessionTemplate 的,SqlSessionManage 的比较简单一点。
- SqlSessionManage 内部有一个线程私有变量 localSqlSession。
private final ThreadLocal<SqlSession> localSqlSession = new ThreadLocal();
- SqlSessionManage 会将 DefaultSqlSession 放入到 ThreadLocal 线程私有的变量 localSqlSession 中
- 用的时候先从 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;
}
相关文章:
三种 SqlSession
三种 SqlSession SqlSession 是一个接口,并且里面包含了许多 CRUD 操作数据库等方法。 SqlSession 它有三个实现类,分别是 SqlSessionManager 、DefaultSqlSession 和 SqlSessionTemplate,其中 DefaultSqlSession…...
Mybatis SQL构建器类 - 问题答案
问题 Java开发人员可能会碰到的最棘手的事情之一就是在Java代码中嵌入SQL语句。通常情况下,这是因为需要动态生成SQL语句 - 否则可以将其外部化到文件或存储过程中。正如你已经了解到的,MyBatis在其XML映射功能中有一个强大的解决方案来生成动态SQL。然…...
React 是什么?有什么特性?有哪些优势?
一、是什么 React,用于构建用户界面的 JavaScript 库,只提供了 UI 层面的解决方案 这句话的意思是,React 是一个专注于构建用户界面的 JavaScript 库,它主要关注于解决 UI 层面的问题。它并不是一个全功能的框架,而是…...
瑞吉外卖项目详细总结
文章目录 瑞吉外卖1.技术栈2.项目文件架构3.业务功能模块(例子)3.1管理员登录接口层(Controller)3.2管理员登录实现层(ServiceImpl)3.3管理员登录服务层(Service)3.4管理员登录Mapper层 4.公共模块4.1 BaseContext(保存…...
Cytoscape 3.10安装包下载及安装教程
Cytoscape3.10下载链接:https://docs.qq.com/doc/DUkpuR0RVU0JVWkFP 1、选中下载好的安装包,右键选择解压到“Cytoscape 3.10”文件夹 2、双击打开“Cytoscape_3_10_0_windows_64bit.exe” 3.点击“Download”,请耐心等待“Java”完成 4、点击…...
data.TensorDataset解析
data.TensorDataset 是 PyTorch 中的一个类,用于创建一个包含多个张量的数据集。这个类的主要作用是将输入的张量组合成一个数据集,使得在训练过程中可以方便地进行数据加载和迭代。 具体来说,TensorDataset 接受一系列的张量作为输入参数&a…...
贝锐花生壳全新功能:浏览器一键远程访问SSHRDP远程桌面
为了满足特定场景的远程访问需求,如:远程群晖NAS设备、远程SQL Server数据库/MySQL数据库、3389远程桌面(RDP远程桌面)、远程SSH、我的世界游戏联机…… 贝锐花生壳推出了场景映射服务,不仅提供满足相应场景的网络带宽…...
2024 年度 AAAI Fellows 揭晓!清华大学朱军教授入选!
今日,国际人工智能领域最权威的学术组织 AAAI 揭晓 2024 年度 Fellows 评选结果,新增 12 位 Fellow。 其中,清华大学计算机系教授朱军因「在机器学习理论与实践方面做出的重大贡献」而成功入选,成为本年度入选的唯一华人学者&…...
Linux(openssl):用CA证书签名具有SAN的CSR
Linux(openssl):创建CA证书,并用其对CSR进行签名_生成ca证书签名请求文件csr-CSDN博客 提供了方法为CSR进行签名。 对于有SAN的CSR如何签名呢? 1.创建CA证书,与下面的帖子一样...
从零开始了解大数据(七):总结
系列文章目录 从零开始了解大数据(一):数据分析入门篇-CSDN博客 从零开始了解大数据(二):Hadoop篇-CSDN博客 从零开始了解大数据(三):HDFS分布式文件系统篇-CSDN博客 从零开始了解大数据(四):MapReduce篇-CSDN博客 从零开始了解大…...
增量预训练经验积累(3)
站在巨人的肩膀上才能走的更远~本文主要是针对《千亿参数开源大模型 BLOOM 背后的技术》进行学习和提取关键经验。 1、BLOOM与Megatron-DeepSpeed 1.1 BLOOM训练细节 BLOOM 的模型架构与 GPT3 非常相似,只是增加了一些改进,176B BLOOM 模型的训练于 2022 年 3 月至 7 月期…...
R语言【CoordinateCleaner】——cc_dupl():根据物种名称和坐标以及用户定义的附加列删除或标记重复的记录
Package CoordinateCleaner version 2.0-20 Parameters cc_dupl(x,lon "decimallongitude",lat "decimallatitude",species "species",additions NULL,value "clean",verbose TRUE ) 参数【x】:data.frame。包含地…...
Hadoop安装笔记1单机/伪分布式配置_Hadoop3.1.3——备赛笔记——2024全国职业院校技能大赛“大数据应用开发”赛项——任务2:离线数据处理
将下发的ds_db01.sql数据库文件放置mysql中 12、编写Scala代码,使用Spark将MySQL的ds_db01库中表user_info的全量数据抽取到Hive的ods库中表user_info。字段名称、类型不变,同时添加静态分区,分区字段为etl_date,类型为String&am…...
python数据分析之交叉验证
python数据分析之交叉验证 1、常用的分类算法 有监督:SVM向量机、梯度提升、决策树(随机森林)、朴素贝叶斯、逻辑斯蒂回归、神经网络(cnn、rnn) 无监督:k-means、隐马尔可夫 2、数据分析过程 1、采集数据 2、数据预处理 3、特征选择 4、模型训练、评估、保存 5、模型…...
机器人技能学习--数据集剖析
文章目录 前言数据总览数据介绍actionsrobot0_eef_poserobot0_eef_quatstatesobject 参考资料 前言 一切为了能自己构建属于自己的数据集,所以,从现有数据集剖析入手。 目前,基于 MimicGen 官方提供的数据集,初始数据集有11组…...
Jenkins的Transfers路径怎么配置,解决Transfers配置不生效的问题
Transfers配置: 1.配置Source files: 要填写jar包的相对路径,从当前项目工作空间的根目录开始,看看我的工作空间你就懂了 !如图 我填的是 parent/build/libs/parent-1.0.0.jar,即不要 fdw1/ 的前缀 2.配置Remote directory: 远程目标文件夹,也就是你jar包要放到远程…...
php安装扩展event 提示 No package ‘openssl‘ found 解决方法
在使用pecl编译安装最新版event模块的时候提示 No package openssl found , 可是本机是安装了openssl的, 编译时找不到, 大概率就是环境配置的问题了, 增加 OPENSSL_CFLAGS OPENSSL_LIBS环境变量即可解决. 异常提示信息: checking for openssl > 1.0.2... no configure: …...
基于SpringBoot的动物领养平台的设计与实现
文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于SpringBoot的动物领养平台的设计与实…...
计算机网络期末复习——计算大题(一)
个人名片: 🦁作者简介:一名喜欢分享和记录学习的在校大学生 🐯个人主页:妄北y 🐧个人QQ:2061314755 🐻个人邮箱:2061314755qq.com 🦉个人WeChat:V…...
2024年深度学习、计算机视觉与大模型面试题综述,六大专题数百道题目
DeepLearning-Interview-Awesome-2024 本项目涵盖了大模型(LLMs)专题、计算机视觉与感知算法专题、深度学习基础与框架专题、自动驾驶、智慧医疗等行业垂域专题、手撕项目代码专题、优异开源资源推荐专题共计6大专题模块。我们将持续整理汇总最新的面试题并详细解析这些题目&a…...
解读 $mash 通证 “Fair Launch” 规则,将公平发挥极致
Solmash 是 Solana 生态中由社区主导的铭文资产 LaunchPad 平台,该平台旨在为 Solana 原生铭文项目,以及通过其合作伙伴 SoBit 跨链桥桥接到 Solana 的 Bitcoin 生态铭文项目提供更广泛的启动机会。有了 Solmash,将会有更多的 Solana 生态的铭…...
06、docker 安装mysql8
Docker 安装 MySQL8 下载mysql8的镜像 docker pull mysql:8.0.32启动镜像 docker run -p 3307:3306 --name mysql8 -e MYSQL_ROOT_PASSWORD123456 -d mysql:8.0.32配置挂载 创建挂载目录 mkdir -p /docker/mysql8.0.32/copy配置文件到创建的目录下 docker cp mysql:/etc/mysql…...
魔改Stable Diffusion,开源创新“单目深度估计”模型
单目深度估计一直是计算机视觉领域的难点。仅凭一张 RGB 图像,想要还原出场景的三维结构,在几何结构上非常不确定,必须依赖复杂的场景理解能力。 即便使用更强大的深度学习模型来实现,也面临算力需求高、图像数据注释量大、泛化能力弱等缺点。 为了解决这些难题&a…...
使用JAVA Zookeeper构建分布式键值存储
在这篇文章中,我将使用 JAVA 和网络套接字构建一个简单的分布式键值存储。 我将展示如何在具有多个分区和复制的集群中使用 Zookeeper 作为协调服务。 本系统中Zookeeper服务的功能如下: 维护从服务器到分区的映射,即哪些服务器属于分区“i”。这些数据还可用于推断哪些服务…...
2023-12-19 LeetCode每日一题(寻找峰值 II)
2023-12-19每日一题 一、题目编号 1901. 寻找峰值 II二、题目链接 点击跳转到题目位置 三、题目描述 一个 2D 网格中的 峰值 是指那些 严格大于 其相邻格子(上、下、左、右)的元素。 给你一个 从 0 开始编号 的 m x n 矩阵 mat ,其中任意两个相邻格子的值都 不…...
gin框架使用系列之五——表单校验
系列目录 《gin框架使用系列之一——快速启动和url分组》《gin框架使用系列之二——uri占位符和占位符变量的获取》《gin框架使用系列之三——获取表单数据》《gin框架使用系列之四——json和protobuf的渲染》 一 、表单验证的基本理论 在第三篇中,我们介绍了如何…...
HackTheBox - Medium - Linux - Interface
Interface Interface 是一种中等难度的 Linux 机器,具有“DomPDF”API 端点,该端点通过将“CSS”注入处理后的数据而容易受到远程命令执行的影响。“DomPDF”可以被诱骗在其字体缓存中存储带有“PHP”文件扩展名的恶意字体,然后可以通过从其…...
C++ 字符串操作说明 续
一、strstr函数 extern char *strstr(char *str1, const char *str2); 1. strstr(str1,str2) 函数用于判断字符串str2是否是str1的子串。如果是,则该函数返回str2在str1中首次出现的地址;否则,返回NULL。 2. str1: 被查找目标 string …...
[情商-7]:如何回答没有标准答案的两难问题
目录 前言: 一、用“逻辑推理思维”回答两难问题 二、用“情绪思维”回答两难问题 1.1 关注提问者提出问题背后的情绪状态和情绪/情感诉求 1.2 常见的常见的情绪和情感诉求 1.3 女性情感分析 1.4 理解女性情感的语言 1.5 如何通过语言理解女性的情绪需求 三…...
对偶问题的基本性质
写于:2024年1月3日晚 修改于: 原规划与对偶规划 原规划对偶规划 max z C T X s.t. { A X ≤ b , 其中 X ( m ∗ 1 ) X ≥ 0 \begin{aligned} & \max \mathrm{z}\mathbf{C}^T \mathbf{X} \\ & \text { s.t. }\left\{\begin{array}{l}\mat…...
商标查询网站/短视频营销策划方案
一.冒泡排序 冒泡排序是运行最慢点排序算法,但是确实最简单的。 下图可以理解为队员排队。 遵循的规则: 1. 比较两个队员。 2. 如果左边的队员高,则两队员位置交换。 3. 向右移动一个位置,比较下…...
wordpress删掉不需要的/新冠疫苗接种最新消息
事件机制和消息循环原理1、鼠标和键盘事件2、event 对象常用属性3、源代码1、鼠标和键盘事件 代码说明<Button-1> <ButtonPress-1> <1>鼠标左键按下,2 表示中间的滚轮,3 表示右键<ButtonRelease-1>鼠标左键释放<B1-Motion&g…...
怎么查看网站的友情链接/现在什么app引流效果好
原因: 数据库table和插入语句的字符编码不匹配或者数据库table的编码不支持中文 解决方案: 修改table中的字符编码为:utf-8(或gbk,gb2312) 在代码中链接数据库时,连接字符串后面加上?characterEncodingutf8,例如jdbc:…...
无锡网站关键词推广/seo这个行业怎么样
RSPdx多天线端口14位SDR接收器性能一览SDRplay RSPdx是对流行的RSP 2和RSP 2 pro多天线接收器的完全重新设计。它是宽带全功能14位SDR,涵盖从1 kHz到2 GHz的整个RF频谱。结合现成的SDR接收器软件(包括SDRplay提供的SDRuno)的功能,您可以一次监视高达10 M…...
企业标志logo/seo课堂
目录 一、String 对象 1、属性 2、常用方法 二、Array 对象 1、属性 2、常用方法 三、Date 日期对象 1、创建 Date 日期对象 2、常用方法 四、Math 对象 一、String 对象 1、属性 length:表示字符串的长度 2、常用方法 【1】与 HTML 相关的方法 bold(…...
类似美团网的网站是怎么做的/黄山网站seo
今天看到《编码:隐匿在计算机软硬件背后的语言》的第十二章:二进制加法器。讲述了全加器,半加器的原理以及如何实现加法。实现加法时所使用的全加器,半加器中包含的所有逻辑门在C语言中都有相应的运算符,就想着能不能利…...