Spring 事务 数据库连接获取和释放原理

news2024/9/28 0:43:45

##调试demo

@Service
public class CrmUserService {

    @Autowired
    private CrmUserDao crmUserDao;

    @Autowired
    private CrmLoginLogDao crmLoginLogDao;

    @Transactional
    public void getUser() {
        System.out.println("Service::"+Thread.currentThread().getName());
        System.out.println(crmUserDao.getUser());
        System.out.println(crmLoginLogDao.getLoginLog());
    }

}


@Mapper
public interface CrmLoginLogDao {

    @Select("select user_name from login_log")
    public List<String> getLoginLog();

}


@Mapper
//@DS("slave")
public interface CrmUserDao extends BaseMapper {

//    @Select("select version_code from t_app_update")
//    @Select("select pg_sleep(1200)")
    @Select("select user_name from user_info")
    public List<String> getUser();

}

##目标方法被代理

##创建事务 createTransactionIfNecessary

##tm.getTransaction

##获取事务doGetTransaction()

##获取事务数据库连接,ConnectionHolder  TransactionSynchronizationManager.getResource(obtainDataSource())

##获取数据源TransactionSynchronizationUtils.unwrapResourceIfNecessary(key)

##获取Object value = doGetResource(actualKey)

private static final ThreadLocal<Map<Object, Object>> resources =       new NamedThreadLocal<>("Transactional resources");

线程首次获取到值为空

##transaction  中属性ConnectionHolder为空

##开始事务

##判断txObject.hasConnectionHolder()是否有ConnectionHolder 为false,创建ConnectionHolder

##ConnectionHolder 设置到DataSourceTransactionManager,连接事务自动提交改为false

##事务中第一次sql查询,调用mapper查询

public abstract java.util.List com.newland.mi.dao.CrmUserDao.getUser()

##获取连接

Connection connection = getConnection(statementLog);

##从事务中获取连接

Connection connection = transaction.getConnection()

##从之前ConnectionHolder获取连接

return conHolder.getConnection();

##事务中第二次sql查询,调用mapper查询

public abstract java.util.List com.newland.mi.dao.CrmLoginLogDao.getLoginLog()

##从事务中获取连接

##查询完成,清空事务

cleanupTransactionInfo(txInfo);

##提交事务,释放连接

commitTransactionAfterReturning(txInfo);

##提交事务

##清理资源

cleanupAfterCompletion(status);

##清理

##设置事务自动提交,设置事务隔离级别为空

con.setAutoCommit(true);

DataSourceUtils.resetConnectionAfterTransaction(       con, txObject.getPreviousIsolationLevel(), txObject.isReadOnly());

##释放数据库连接回连接池

DataSourceUtils.releaseConnection(con, this.dataSource);

##清空ConnectionHolder  的currentConnection为空

this.currentConnection = null;

##数据库连接放回连接池

 doCloseConnection(con, dataSource);

 

##数据库连接池

 ##connection.recycle();

 

##最终放入池内

 ##加锁,放回DruidConnectionHolder[]数组

private volatile DruidConnectionHolder[] connections;

 ##放入数组最后一个位置
 incrementPoolingCount() 数组长度加1

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2088278.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

趣味算法------单一背包问题(01背包问题)贪心算法解决

目录 ​编辑 前言 例题 题目描述 输入输出格式 解题思路 具体代码 C语言代码 python代码 总结 前言 单一背包问题&#xff08;0-1 Knapsack Problem&#xff09;是组合优化中的一个经典问题&#xff0c;它可以形式化为&#xff1a;给定一组物品&#xff0c;每个物品都…

微信小程序SSL证书

微信小程序开发投入项目使用就需要用到SSL证书&#xff0c;主要原因SSL证书是让服务器的数据采取加密协议传输&#xff0c;避免来自中间人劫持或数据泄漏&#xff0c;所以在小程序交互数据过程中起到了关键性的作用。 为考虑到多个手机版本的兼容性&#xff0c;所以微信小程序…

Linux提升篇-Linux虚拟网络介绍

一、Linux虚拟网络-网桥 和tap/tun、veth-pair 一样&#xff0c;Bridge 也是一种虚拟网络设备&#xff0c;所以具备虚拟网络设备的所有特性&#xff0c;比如可以配置 IP、MAC 等。 除此之外&#xff0c;Bridge 还是一个交换机&#xff0c;具有交换机所有的功能。 对于普通的网…

移远通信精彩亮相IOTE 2024:探究技术融合,展望智慧未来

8月28-30日&#xff0c;IOTE 2024 第二十二届国际物联网展在深圳正式拉开帷幕&#xff0c;此次活动汇聚全球800家参展企业、10万来自工业、物流、基础建设、智慧城市、智慧零售领域的集成商、终端用户参观展会。 延续着2023年的辉煌成果&#xff0c;在2024 IOTE展上&#xff0c…

Mamba介绍,和Transformer对比

本文根据“一文看懂Mamba&#xff0c;Transformer最强竞争者”&#xff08;机器之心 编辑&#xff1a;Panda&#xff09;一文修改&#xff0c;并补充了一些新的观点。 在深度学习领域的广阔天地中&#xff0c;随着技术的不断进步&#xff0c;对更高效、更强大模型架构的探索从未…

Anaconda和Pycharm超详细安装教程(2024版本)!pycharm配置anaconda运行环境!

目录 一、anaconda下载安装 二、pycharm配置anaconda环境 工欲善其事&#xff0c;必先利其器。 安装包、激活码&#xff08;pycharm、anaconda、python&#xff09;点击领取 一、anaconda下载安装 1. Anaconda介绍 Anaconda 是一个基于 Python 的数据处理和科学计算平台&…

Dell 服务器 PowerEdge T440 驱动器故障

目录 1.故障&#xff1a;Dell 服务器 PowerEdge T440 驱动器指示灯闪烁 2.解决方案 1.故障&#xff1a;Dell 服务器 PowerEdge T440 驱动器指示灯闪烁 2024年8月30日 Dell PowerEdgeT440 驱动器指示灯琥珀色闪烁 查看 RAID5 磁盘组属性 显示 Virtual Disk 0:RAID5 降级 De…

Yolov10(yolov8代码里兼容版本)推理代码解析,抛去nms,大道至简

一、模型的输出头 下载官方的yolov8代码库https://github.com/ultralytics/ultralytics 打开ultralytics/nn/modules/head.py&#xff0c;主要需要看一下模型的输出头是如何做训练和预测推理。 v10检测头继承与常规的检测头Detect&#xff0c;初始化里重构了一下分类的输出头…

pacs图像打不开怎么办 --日常工作总结

先强调一下,我不是专门做图像入库和图像归档,我负责的是临床这边的影像,下面是占在我的业务日常分析总结的哈,(不太专业,勿喷) 我们经常会遇到在打开某个检查的时候,出现黑框,日志定位wado服务取不到图 这种情况一般分为 (1) 工作站,工作组,路由,存储卷配置缺失 ---对应的wad…

【C语言从不挂科到高绩点】05-流程控制语句-switch语句

Hello&#xff01;彦祖们&#xff0c;俺又回来了&#xff01;&#xff01;&#xff01;&#xff0c;继续给大家分享 《C语言从不挂科到高绩点》课程 本套课程将会从0基础讲解C语言核心技术&#xff0c;适合人群&#xff1a; 大学中开设了C语言课程的同学想要专升本或者考研的…

Linux上启动redis

1.默认启动方式:在系统的任意位置执行 redis-server即可启动 ps:这是前端界面启动&#xff0c;无法直接连接redis&#xff0c;想要连接的话只能另外启动一个窗口&#xff0c;因此下面我们介绍后台启动redis 2.指定配置启动&#xff1a; redis的配置文件位置&#xff1a…

二叉树的基本知识

&#xff08;写给未来遗忘的自己&#xff09; 1.二叉树的种类 1. 满二叉树&#xff1a;所有分支都有数&#xff08;都填满&#xff09; 2. 完全二叉树&#xff1a;除了最底层没填满外其他的都满了&#xff0c;而且最底层从左到右是存在数的位置是连续的 3.二叉搜索树&#xf…

大学开学必备好物清单有哪些?开学必备清单大全,超详细版!

即将踏入大学校园的新生们&#xff0c;是否已经准备好迎接全新的挑战与机遇呢&#xff1f;在开学之前&#xff0c;将必备物品筹备妥当是极为重要的事情&#xff0c;因为这能够助力大家更为良好地适应大学生活。接下来&#xff0c;为大家提供一份实用的大学生开学必备物品清单&a…

性能测试面试题总结

最近这一年&#xff0c;对性能测试有了更多的认知。 压力、强度测试&#xff1a;在一定软硬件环境下&#xff0c;通过高负载的手段来使服务器资源&#xff08;强调服务器资源&#xff0c;硬件资源&#xff09;处于极限状态&#xff0c;测试系统在极限状态下长时间运行是否稳定…

大模型微调---qwen实战

一、Qwen大模型的介绍 Qwen是阿里云开发的大语言模型&#xff0c;整个qwen系列的模型&#xff0c;由base模型、rm模型、chat模型、code模型、math模型等等。 qwen采用chatml样式的格式来进行模型训练&#xff0c;chatml格式可以时模型有效区分各类信息&#xff0c;可以增强模…

blender插件库

插件安装教程&#xff1a;blender4.2中安装插件的方式-CSDN博客 blender官网插件库地址&#xff1a;Add-ons — Blender Extensions 1&#xff0c;ExtraObjects&#xff1a;提供更多网格形状&#xff0c; 链接:https://caiyun.139.com/m/i?2gov6Lw5RAib8 提取码:0ayj 复制内…

有向图的转置:算法分析与实现

有向图的转置:算法分析与实现 前言1. 邻接链表表示法2. 邻接矩阵表示法结论前言 在计算机科学中,图是一种非常重要的数据结构,用于表示对象之间的复杂关系。有向图(Directed Graph)是一种图,其边具有方向性。有向图的转置(Transpose)是一种基本操作,它将图中所有边的…

LLM面经(持续更新中)

Tokenizer Norm Batch Norm 好处 使得模型训练收敛的速度更快 每层的数据分布都不一样的话(解决Internal Covariance Shift)&#xff0c;将会导致网络非常难收敛和训练&#xff0c;而如果把每层的数据都在转换在均值为零&#xff0c;方差为1的状态下&#xff0c;这样每层数据…

第一个golang项目

第一个golang项目 开发环境安装golangVisual Studio Code安装golang语言插件初始化项目创建目录初始化golang配置 开始开发安装所需依赖创建main.go创建配置文件创建命令版本命令查看指定目录指定后缀文件并将指定内容替换为新内容 打包并运行 前因后果&#xff1a;因为工作需要…

不可错过的10款电脑监控软件推荐,电脑监控软件哪个好?宝藏安利

电脑监控软件已成为企业管理和家庭安全的重要工具。 无论是为了提升工作效率、保障信息安全&#xff0c;还是为了监督孩子的学习情况&#xff0c;一款优秀的电脑监控软件都能发挥巨大作用。 本文将为您推荐10款不可错过的电脑监控软件&#xff0c;并详细分析它们的优势与特点&…