标签:数据库 tcp 连接 排查 关闭 mysql id 代码
在一些项目中由于一些特殊原因仍然保留着显示的获取数据库连接(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反向查找代码了...
标签:数据库,tcp,连接,排查,关闭,mysql,id,代码 来源: https://www.cnblogs.com/zhya/p/11447978.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。