记一次排查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反向查找代码了...

原文地址:https://www.cnblogs.com/zhya/p/11447978.html

时间: 2024-10-28 12:42:48

记一次排查mysql数据库连接未关闭问题的过程的相关文章

Python3 MySQL 数据库连接 -PyMySQL

Python 3  操作mysql http://www.runoob.com/python3/python3-mysql.html Python3 MySQL 数据库连接 本文我们为大家介绍 Python3 使用 PyMySQL 连接数据库,并实现简单的增删改查. 什么是 PyMySQL? PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb. PyMySQL 遵循 Python 数据库 API v2.0 规范,并包含了 p

解决mysql数据库连接问题

设置mysql远程连接root权限 在远程连接mysql的时候应该都碰到过,root用户无法远程连接mysql,只可以本地连,对外拒绝连接.需要建立一个允许远程登录的数据库帐户,这样才可以进行在远程操作数据库.默认情况下MYSQL数据库的系统数据库mysql系统表user内用户权限只提供localhost本机登陆:需要更改权限才能实现远程连接MYSQL数据库. 通过以下方式来确认: root#mysql -h localhost -uroot -pEnter password: ******We

Python3.5 MySQL 数据库连接

Python3.5  MySQL 数据库连接 在本文中介绍 Python3 使用PyMySQL连接数据库,并实现简单的增删改查 为什么使用PyMySQL? PyMySQL是在Pyhton3.x版本中用于连接MySQL数据库的一个库,Python2中则使用mysqldb库. PyMySQL安装 在使用PyMySQL之前,需要确保安装PyMySQL库. 可以使用pip进行安装 pip install PyMySQL 数据库连接 连接数据库前,请先确认以下事项: 您已经创建了数据库 TESTDB. 在

Java利用Eclipse和Mysql数据库连接并存储图片——存储图片

import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; public class insertImage {  public static void main(String[]args) throws Ex

Mysql数据库连接、查询、记录集操作代码

Mysql数据库链接代码 function dbConnect($hostname,$username,$pass,$db_name,$pconnect =0) { $func=empty($pconnect) ? 'mysql_connect':'mysql_pconnect'; if(!$connect){ [email protected]$func($hostname,$username,$pass) or die("<font size='2'>Mysql_Error :

MySQL连接问题【如何解决MySQL连接超时关闭】

--MySQL连接问题[如何解决MySQL连接超时关闭] ------------------------------------------------转载 最近做网站有一个站要用到WEB网页采集器功能,当一个PHP脚本在请求URL的时候,可能这个被请求的网页非常慢慢,超过了mysql的 wait-timeout时间,然后当网页内容被抓回来后,准备插入到MySQL的时候,发现MySQL的连接超时关闭了,于是就出现了"MySQL server has gone away"这样的错误提示

解决cursor未关闭造成的死锁

参考:https://blog.csdn.net/zc474235918/article/details/72731363/ https://blog.csdn.net/zmx729618/article/details/51259135 # import pymysql # conn=pymysql.connect(host='127.0.0.1',user='root',passwd='123456',db='mysql',charset='utf8', port=3306) # cur=c

报表开发工具中mysql数据库连接编码转化失效解决方案

1. 问题描述 在报表开发工具FineReport中,mysql数据库连接通过数据连接编码转换进行编码的转换,在通过报表录入往数据库中录入中文数据的时候,总是出现乱码,这个该怎么解决呢? 2. 解决方案 2.1 检查系统的默认字体 例如查看windows下C/window/fonts的字体样式,如下图: 如果没有以上字体,百度一下缺少字体自行安装,安装之后,已经包含以上的字体如果还是出现问题,则需要参看及修改MySQL字符集. 2.2 参看及修改MySQL字符集 · 查看MySql字符集 MyS

Java利用Eclipse和Mysql数据库连接并存储图片——取出图片

通过流和JPEGCodec.JPEGImageEncoder类的操作来取出数据库中的图片. 注释很详细,注意要额外的引入mysql的驱动包,要修改数据库的用户名和密码以及URL.希望对大家有帮助. import java.awt.image.BufferedImage; import java.io.*; import java.sql.Blob; import java.sql.Connection; import java.sql.DriverManager; import java.sql