事务未提交和连接未关闭

news/发布时间2024/8/25 17:23:27

事务未提交和连接未关闭


背景

最近一个项目出现了应用服务器无法登录的现象.
出现现象后,给出了jstack和应用的log等信息. jstack 里面所有的 http的nio 线程都在parked状态. 
然后log里面出现了大量的获取不到链接的提示. 所以第一反应是因为事务未提交导致的连接池泄露. 
但是后续与同事一起看问题时发现, 并没有未提交的事务. 
所以感觉自己可能对 事务未提交和连接未关闭的场景产生了混淆.所以想着能够总结一下两种场景, 希望能够学习和提高. 

现象

所有的工作线程都进入 parked的状态:
"http-nio-5200-exec-179" #59186 daemon prio=5 os_prio=0 tid=0x00007f4d941ca800 
nid=0x28e3da waiting on condition [0x00007f4b976f9000]java.lang.Thread.State: TIMED_WAITING (parking)服务器没有压力 CPU/内存都很低应用服务器的日志显示: 
Failed to obtain JDBC Connection; nested exception is java.sql.SQLTransientConnectionException: 
tenancy-connection01 - Connection is not available, request timed out after 30000ms数据库显示有大量的正在执行的SQL,并且链接未关闭,能够查询出来.

区别和理解-事务未提交

事务未提交和连接未关闭其实是两个维度的问题. 事务未提交可能链接已经被关闭了. 
这种问题很有可能是 finally 里面有connection的 dispose或者是close的命令
但是存在有 未被捕获的异常导致 transaction 没有commit/rollback 的情况. 导致应用线程(大部分为http-nio)返回给连接池管理的数据库链接(hikari后者是durid)里面还存在未提交的事务. 
因为应用已经将connection返回给了 pool , 所以pool认为此connection 可以进行服用. 
然后再给其他申请connection的 thread 时, thread 要commit 事务时就会报错, 因为前面存在未rollback的事务.
导致自己的产品出现异常.  所以这个时候, 就会出现施暴者没有反馈, 但是受害者再惨叫的情况. 此时需要关注的是 链接关闭时, 如果打开链接的线程堆栈忘记了事务的 commit/rollback 需要记录下来. 
这类错误肯定会导致应用上有人报错, 但是报错的不是施暴者, 提前发现很重要. 可以避免问题爆发. 

区别和理解-链接未关闭

链接未关闭的情况时 事务可能未提交, 也可能已经提交了. 
不管事务有没有提交, 那么就需要足够多的异常操作,将连接池占满,导致应用不可用. 此时需要关注hikari等的连接数指标. 
如果连接数指标单调递增没有下降的趋势, 并且没有应用反馈存在事务条失败的问题时: 
很有可能出现了链接未关闭的问题需要注意一般情况下连接未关闭时一个比较缓慢的过程. 并且如果业务操作非常低频率
可能很久也发现不了问题. 但是当存在一种比较2B的代码时可能瞬间将应用服务器的连接池打满
那就是 for循环或者是递归调用 sql执行, 同事没有关闭数据库链接. 
比如连接池设置为100 , 然后一个大于100 的循环内打开链接进行insert 或者是update
并且链接不关闭.  那么很快应用机会不可用,出现宕机的情况. 

防范方法

1. 可以通过代码的规范化检查来避免此类问题. 
2. 通过代码规范, 避免手工建立连接,并且不进行释放来处理. 
3. 测试时需要考虑足够多的场景, 尤其是数据量, 避免小数据量的情况无法发现问题.
4. 必须增加监控指标, 避免测试环境经常重启导致问题外泄. 
5. 举一反三,增加研发培训, 对新员工增加严重问题代码的培训和宣贯.

其他理解

java运行其实是通过jvm虚拟机来进行处理的. 
jvm其实可以理解为一个小型的linux系统. 
既然是虚拟机, 是操作系统, 那么资源就是系统最重要的资产. 
关闭资源就是系统最重要的工作. CPU/内存/线程/文件句柄/链接(http,db) 都是系统中的资源.
任何一种资源受到过量的使用都会像癌症一样蔓延到其他的资源.
最终导致系统不可用. 解决问题的核心其实在于找到那种资源收到了过量的使用. 
并且找到过量使用的始作俑者. 经历过问题锤炼, 并且有足够的记忆力和敏感度就非常重要了.
遇到问题需要做有根据的假设,并且进行求证. 
但是不能无条件无理由的假设, 调查时的错误假设会导致调查失败.  
调查失败会导致产品不可用, 影响很坏. 

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

如若内容造成侵权/违法违规/事实不符,请联系连锁易网进行投诉反馈email:xxxxxxxx@qq.com,一经查实,立即删除!

相关文章

跟踪到重建和重建到跟踪

跟踪到重建和重建到跟踪 https://arxiv.org/pdf/1910.00130.pdf 摘要——对象跟踪和三维重建通常是一起进行的,跟踪被用作重建的输入。然而,所获得的重建也提供了用于改进跟踪的有用信息。提出了一种新的方法来闭合这个环路,先跟踪重建,然后重建跟踪。方法,MOTSFusion(多…

2859. 计算 K 置位下标对应元素的和

1.题目介绍 2.题解 2.1 枚举 思路 这里你只要知道 num % 2 相当于是取到二进制最后一位, num / 2 是将二进制整体向右推移一位即可 代码 class Solution { public:int sumIndicesWithKSetBits(vector<int>& nums, int k) {int ans = 0;for(int i = 0; i < nums.s…

使用注册表以解决转移文件后文件打不开或图标变白的问题--强迫症必看

一.底层原因 强调两个字 路径(path) 转移了文件位置,便是改变了根路径 但许多打开方式仍是指向原来的文件路径,因此打开方式的指向为空,导致文件打不开或图标变白.以我个人为例,由于之前没有管理好磁盘,新加卷D盘十分杂乱,于是就将许多下载的软件收纳到一个文件夹里。 …

每日例题 成绩分析

一.题目 小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。 请计算这次考试的最高分,最低分和平均分。 二.题目要求 1.输入描述 输入的第一行包含一个整数n(1≤n≤104),表示考试人数。 接下来n行,每行包括一个0至100的整数,表示一…

PYTHON 用几何布朗运动模型和蒙特卡罗MONTE CARLO随机过程模拟股票价格可视化分析耐克NKE股价时间序列数据|附代码数据

原文链接:http://tecdat.cn/?p=27099 最近我们被客户要求撰写关于蒙特卡罗的研究报告,包括一些图形和统计输出。 金融资产/证券已使用多种技术进行建模。该项目的主要目标是使用几何布朗运动模型和蒙特卡罗模拟来模拟股票价格。该模型基于受乘性噪声影响的随机(与确定性相反…

每日一图——2024/1/24

每日一图————技多不压身本文来自博客园,作者:{Mr Q},转载请注明原文链接:https://www.cnblogs.com/Layout-QJS/p/17985947

大模型系列|垂直大模型的几种训练策略(一)

大模型系列|垂直大模型的几种训练策略(一) 1 目前垂直行业大模型的几种训练策略 参考:大模型时代-行业落地的再思考重新训练:使用通用数据和领域数据混合,from scratch(从头开始)训练了一个大模型,最典型的代表就是BloombergGPT。 二次预训练:在一个通用模型的基础上…

数据库学习笔记(五)—— MySQL 之 瓶颈及优化篇

MySQL 之 瓶颈及优化篇数据库瓶颈阶段一:企业刚发展的阶段,最简单,一个应用服务器配一个关系型数据库,每次读写数据库。 阶段二:无论是使用 MySQL 还是 Oracle 还是别的关系型数据库,数据库通常不会先成为性能瓶颈,通常随着企业规模的扩大,一台应用服务器扛不住上游过来…

春节期间应该采取什么措施来预防离职员工泄露信息?

春节前后,员工流动性增加,企业确实需要特别关注离职员工可能带来的数据安全风险。离职员工,尤其是那些掌握核心商业秘密或敏感信息的员工,可能在离开公司时有意或无意地带走或泄露这些信息。为了防范这种风险,企业可以采取以下措施:提前预警:对即将离职的员工进行预警,…

硬链接和软连接

1、硬链接 硬连接指通过索引节点号来进行连接。 inode是可以对应多个文件名的在Linux的文件系统中,保存在磁盘分区中的文件不管是什么类型都给它分配一个编号,称为索引节点号(Inode Index)。 在Linux中,多个文件名指向同一索引节点是存在的。一般这种连接就是硬连接。 硬连接…

scikit-learn.datasets 机器学习库

scikit-learn是一个用于Python的机器学习库,提供了大量用于数据挖掘和数据分析的工具。以下是对这些函数和方法的简要描述:clear_data_home: 清除数据集目录的内容。 dump_svmlight_file: 将数据集保存为SVMLight格式的文件。 fetch_20newsgroups: 下载20个新闻组的文本数据集…

数据可视化是如何被企业重视起来的?

数据可视化,作为信息时代的一项重要技术,正在企业中崭露头角,逐渐成为业务决策和运营管理的得力助手。企业之所以对数据可视化如此重视,是因为它为企业带来了诸多实际利益和战略优势。下面我就以可视化从业者的角度来简单聊聊这个话题。首先,数据可视化为企业提供了更直观…

Linux命令

cp [options] source dest或cp [选项] 源文件 目标文件选项说明:-a:此选项通常在复制目录时使用,它保留链接、文件属性,并复制目录下的所有内容。其作用等于 dpR 参数组合。 -d:复制时保留链接。这里所说的链接相当于 Windows 系统中的快捷方式。 -r 或 --recursive:用于…

.NET集成IdGenerator生成分布式全局唯一ID

前言 生成分布式唯一ID的方式有很多种如常见的有UUID、Snowflake(雪花算法)、数据库自增ID、Redis等等,今天我们来讲讲.NET集成IdGenerator生成分布式全局唯一ID。 分布式ID是什么? 分布式ID是一种在分布式系统中生成唯一标识符的方法,用于解决多个节点之间标识符重复或性…

读AI3.0笔记05_人类与机器学习

人类与机器学习1. 人类与机器学习的关键差距 1.1. 老式人工智能使用的是人类程序员对智能行为构建的显性规则 1.2. DNN这种“从数据中学习”的方法已被逐渐证实比“普通的老式人工智能”策略更成功 1.3. ConvNets的学习过程与人类的学习过程并不是很相似 1.3.1. ConvNets在多个…

Axure rp9入门教程

Axure rp9入门图文教程-基操及介绍免费版安装包请点击此处(避免审查,请点击这)[^这里] 一、界面介绍1. 复制、剪切及粘贴区域 2. 选择模式 3. 插入形状 4. 控点(编辑控点) 5. 置顶和置底 6. 组合和取消组合 7. 调整大小 8. 对齐 9. 预览、共享 10. 元件样式 11. 文本设置 …

微信小程序中引用iconfont

1.将下载的iconfont包,解压缩放到assets目录下,并且建立一个iconfont.wxss文件; 2.在app.json文件中引用(全局可用), @import /assets/iconfont/iconfont.wxss; 3.iconfont.wxss内部结构: 如果下面这种情况,不能用@font-face {font-family: "iconfont"; /* P…

P1765 手机

1.题目介绍 手机 题目描述 一般的手机的键盘是这样的:要按出英文字母就必须要按数字键多下。例如要按出 \(\tt x\) 就得按 \(9\) 两下,第一下会出 \(\tt w\),而第二下会把 \(\tt w\) 变成 \(\tt x\)。\(0\) 键按一下会出一个空格。 你的任务是读取若干句只包含英文小写字母和…

应用监控 eBPF 版:实现高效协议解析的技术探索

使用 eBPF 来进行可观测性需要进行应用层协议解析,但云上微服务软件架构中的应用层协议往往比较复杂,这也给协议解析带来了不小的挑战。传统的协议解析方式存在 CPU、内存占用高,错误率高等问题,在应用监控 eBPF 版中,我们提出一种高效的协议解析方案,实现对应用层协议的…
推荐文章