zoukankan      html  css  js  c++  java
  • 记一次排查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反向查找代码了...

  • 相关阅读:
    sparql学习sparql示例、dbpedia在线验证
    中国绿卡
    逾期率的水有多深,你知道吗?
    ICO和区块链区别
    What are the benefits to using anonymous functions instead of named functions for callbacks and parameters in JavaScript event code?
    Link static data in sql source control
    sql data compare
    viewbag
    多态的实际使用
    win10 sedlauncher.exe占用cpu处理
  • 原文地址:https://www.cnblogs.com/zhya/p/11447978.html
Copyright © 2011-2022 走看看