记一次排查mysql数据库连接未关闭问题的过程
在一些项目中由于一些特殊原因仍然保留着显示的获取数据库连接(Connection)、提交事务、回滚事务、关闭连接等操作;其中关闭连接是比较容易疏忽又比较难在前期发现的问题。
我是如何排查连接未关闭的问题的? 首先还是提出3W:
1.What?
数据库连接是应用服务器和数据库之间建立的tcp连接,在获取连接并进行操作后需要手动关闭以释放资源,就像是文件流一样,资源是有限的。
2.Why?
连接不释放会导致连接池无法回收连接,进而数据库连接逐渐被占满,直到超出数据库设置的最大连接数而拒绝服务,显而易见这是不能接受的;同时由于数据库连接也是tcp连接,未释放的连接会占用应用服务器和数据库服务器之间的tcp连接,有些情况下会导致无法应对突发流量(已经没有足够多的tcp连接)。
3.How?
显示的调用connection.close()关闭连接或者利用spring管理连接。
我的排查步骤
1.扫描代码
由于是显示的开启连接和关闭连接,则可以通过扫描代码文件,获取每个java文件中开启连接的次数和关闭连接的次数,如果关闭连接的次数<开启连接的次数,则说明很可能这里的代码未关闭连接,则可以进一步排查。
但是由于每个开发人员的代码风格不一致,比如有些是connection有些是conn;有些在外部开启了连接,在if-else内部各关闭了2次连接等情况,所以扫描代码的方式可能不太准确。
2.数据库层面排查
如果未关闭连接,则其事务就不会被提交;通过mysql提供的事务表和开启performance_schema后的线程表即可定位未提交事务执行的sql,根据sql反向查找代码,以定位问题所在。
下面通过一个测试程序来模拟

执行代码,执行后,主线程等待

查看mysql事务表,得到thread_id(其实是processlist_id,见下图)

根据processlist_id查询performance_schema线程信息

根据thread_id查询具体的sql

然后就是根据sql反向查找代码了...
记一次排查mysql数据库连接未关闭问题的过程的更多相关文章
- 数据库连接未关闭,conn与rs未关闭
场景: 2000多人使用系统,早上打卡签到,时间点比较集中. 程序:会创建connction连接.但是未关闭,导致tomcat挂了.导致连接池已满 解决:conn.close,rs.close.记住一 ...
- 记一次排查log4net 不输出日志的解决过程
最近发现log4net 不输出日志了,重点排查几个地方,发现都没有问题. 1.[assembly: log4net.Config.XmlConfigurator(ConfigFile = " ...
- 数据库连接不关闭造成的问题以及RowSet的使用
这几天给项目做性能压力测试,发现一个方法压力200之后就会把整个系统弄停掉.仔细检查发现是开发人员调用数据库的写法有问题.用的是spring的jdbcTemplate,在使用回调的时候,在回调里又做了 ...
- 记一次mysql事务未提交导致锁未释放的问题
记一次mysql事务未提交导致锁未释放的问题 ## 查看未提交的事务(3秒内未操作的事务) SELECT p.ID AS conn_id, P.USER AS login_user, P.HOST A ...
- Python3 MySQL 数据库连接 -PyMySQL
Python 3 操作mysql http://www.runoob.com/python3/python3-mysql.html Python3 MySQL 数据库连接 本文我们为大家介绍 Pyt ...
- 【数据库开发】如何创建MySQL数据库连接池(一个基于libmysql的MySQL数据库连接池示例(C/C++版))
http://blog.csdn.net/horace20/article/details/8087557 1. 一般架构说明 图 1 架构层次图 一般应用系统数据库访问模块可大致分为两层,一层 ...
- Mysql数据库连接、查询、记录集操作代码
Mysql数据库链接代码 function dbConnect($hostname,$username,$pass,$db_name,$pconnect =0) { $func=empty($pcon ...
- MySQL连接问题【如何解决MySQL连接超时关闭】
--MySQL连接问题[如何解决MySQL连接超时关闭] ------------------------------------------------转载 最近做网站有一个站要用到WEB网页采集器 ...
- node+mysql 数据库连接池
1. 什么是数据库连接池? 数据库连接池是程序启动时建立足够的数据库连接,并将这些连接组成一个池,由程序动态地对池中的连接进行申请,使用和释放. 2. 使用数据库连接池原理及优点是什么? 数据库连接池 ...
随机推荐
- SQL 递归查询,意淫CTE递归的执行步骤
今天用到了sql的递归查询.递归查询是CTE语句with xx as(....)实现的. 假如表Category数据如下. 我们想查找机枪这个子分类极其层次关系(通过子节点,查询所有层级节点).以下是 ...
- linux安装libreOffice
参考链接:https://qtdebug.com/mac-centos7-libreoffice/ https://blog.csdn.net/diyiday/article/details/7985 ...
- 关于datagridview控件如何动态改变行数问题
首先要把单元格转换成txt文本框然后根据TextChanged事件来进行修改就可以实现 private void Return_DGV_EditingControlShowing(object sen ...
- initramfs机制
1.什么是 Initramfs 在2.6版本的linux内核中,都包含一个压缩过的cpio格式的打包文件.当内核启动时,会从这个打包文件中导出文件到内核的rootfs文件系统,然后内核检查rootfs ...
- BZOJ 1283: 序列 (最大费用流)
题意 有n个正整数,要选取里面的一些数,在保证每m个连续的数中最多选k个的情况下,使得得到的值最大. 分析 我们可以把问题先转化为选k次,每一次每m个数只能选一个.那么根据贪心的策略,每m个里一定会选 ...
- 【LuoguP4482】[BJWC2018]Border 的四种求法
题目链接 题意 区间 boder \(n,q\leq 2*10^5\) Sol (暴力哈希/SA可以水过) 字符串区间询问问题,考虑用 \(SAM\) 解决. boder相当于是询问区间 \([l,r ...
- excel操作之poi-ooxml
目前市场上流行的对于excel处理的框架大致有两种:poi和jxl.对于这两种框架,我们可以做一个简单的对比: 1 开发团队:poi是Apache旗下的一个开源项目,由Apache官方维护,jxl ...
- CodeForces 839C - Journey | Codeforces Round #428 (Div. 2)
起初误以为到每个叶子的概率一样于是.... /* CodeForces 839C - Journey [ DFS,期望 ] | Codeforces Round #428 (Div. 2) */ #i ...
- kubeadm 部署kubernetes1.11.1,dashboard1.10.0
---恢复内容开始--- 实验环境准备2台虚拟机: master节点:172.17.1.36 node节点:172.17.1.40 首先安装master节点: master 的虚拟机是全新的机器,在安 ...
- Nim积的一种???的写法
Nim积总不能一直打四次暴力吧! 用SG定理等东西,可以证明 \((N, \oplus, \otimes)\) 构成一个域.(证明很难,我不会) 其中 \(\oplus\) 为异或, \(x \oti ...