环境:

  持久层:JPA

  数据库连接池:druid

  数据库中间件:Mycat

  数据库:Mysql

报错:

  Unable to acquire JDBC Connection

排查步骤:

方法一:

  1、druid配置没有问题。

  2、Mysql连接数正常,但是发现mysql有很多链接没有释放。(用root用户执行:show full processlist ; 指令)

    

    如图:发现很多State = Sleep的链接,链接都很长,一直不释放链接。

  3、kill掉相应的链接。(因为业务数据不是很重要,为了先恢复功能,用此下策)

  4、接着排查代码。发现JPA的save方法,默认更新一条记录使用如下方式:update tb_name set xxx = xxx where id = xxx ; 使用默认的主键进行数据的更新。而业务侧,由于数据庞大使用了数据库的分库分表,mycat作为数据库中间件,该表的路由规则为:根据用户id去摸,进行数据的分库分表。

  问题原因找到:每次执行更新(save)方法时,Mycat都会广播这条sql,当数在插入时,就造成更新方法阻塞等待(锁,事务相关),导致链接不释放。

方法二:

  1、查看mysql事务表,得到thread_id :  select * from information_schema.INNODB_TRX ;  从结果中的:trx_mysql_thread_id 得到线程id

  2、select * from performance_schema.threads where THREAD_ID = 第一步得到的线程id (这一步可以不执行,目的只是为了演示mysql的线程管理,以及相应的查看方法。)

  3、select * from performance_schema.events_statements_current where THREAD_ID =  第一步得到的线程id ;  根据 SQL_TEXT 得到相应的sql语句。

  以上就是mysql通过阻塞的线程,找到代码中相应的sql的方法。

解决方法:

  1、写sql,在更新数据时,修改JPA默认的方式,使用路由规则去更新数据。

  

mysql连接不释放的更多相关文章

  1. mysql连接的一些问题。

    最近网站出现 User 数据库名称 has already more than 'max_user_connections' active connections 的报错,网站瘫痪.有必要研究下这个问 ...

  2. paip.jdbc 连接自动释放的测试

    paip.jdbc 连接自动释放的测试 使用的mysql jdbc3.1.6  以及5.1.7 测试结果,在没有conn.close()的情况哈.. 作者Attilax  艾龙,  EMAIL:146 ...

  3. 深入理解php的MySQL连接类

    php的MySQL连接类.  后面几个show_databases和show_tables....等方法都用了一堆echo,好像一直不喜欢在类的方法里直接用输出语句,不过这也只是列举数据库和表名,构造 ...

  4. MySQL连接问题【mysql_connect和mysql_pconnect区别】

    --MySQL连接问题[mysql_connect和mysql_pconnect区别] -------------------------------------------------------- ...

  5. mysql连接池的使用工具类代码示例

    mysql连接池代码工具示例(scala): import java.sql.{Connection,PreparedStatement,ResultSet} import org.apache.co ...

  6. 用swoole简单实现MySQL连接池

    MySQL连接池 在传统的网站开发中,比如LNMP模式,由Nginx的master进程接收请求然后分给多个worker进程,每个worker进程再链接php-fpm的master进程,php-fpm再 ...

  7. mysql连接池模块

    如果不想程序在查询数据时卡死或等待过长时间,一般不推荐在node中开启一个连接后全部查询都用这个链接并且不关闭.因为node里面的mysql不像php里的那样会在完成查询后断开,只要不主动断开,连接一 ...

  8. MYSQL连接相关参数和状态值详解

    针对mysql的连接参数和状态值,本文做些介绍和对比 一.MYSQL连接参数变量 1.常用连接数限制参数 show variables like '%connect%'; | max_connect_ ...

  9. Mysql 连接池

    数据库连接池的作用: 数据库连接池负责分配.管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个:释放空闲时间超过最大空闲时间的数据库连接来避免因为没有释放数据库连接 ...

随机推荐

  1. Math小记

    20161231 黄金分割比:短/长=长/(短+长)=((根号5)-1)/2 ≍ 0.618 斐波那契数列前后两项的比值存在极限.设其中三个数为a.b.(a+b),则当项数趋于无穷时有a/b=b/(a ...

  2. uni-app 实现分享生成图片

    <template> <view> <view class="personal_li" @click="shareClick"&g ...

  3. mpvue中按需引入echarts

    大家都知道小程序文件大小不能超过2M, 在项目中引入echarts后,文件大小远远超出2M了.因为echarts文件默认是包含所有图表代码的,所以文件体积会比较大.解决办法如下: 安装 首先我们先安装 ...

  4. intellij idea远程调试

    有时候发布后的包不得不进行debug,但是又不方便本地开发环境直接debug模拟,所以不得不需要远程debug. 启动参数 首先在服务端使用JVM的-Xdebug参数启动Jar包. java -Xde ...

  5. EmuELEC系统的结构

    分区结构 在img写入后, 会产生两个分区EMUELEC: 用于启动的文件, 例如dtb文件等, 以及system.img & system.img.md5, EmuELEC的系统文件都在这个 ...

  6. RK3288板子刷linux-ubuntu16固件

    Firefly-RK3288 是一个高性能平台,拥有强大的多线程运算能力.图形处理能力以及硬件解码 能力,而且支 持 Android和Ubuntu双系统; 下面我们使用RK3288的板子刷linux ...

  7. 百度网盘快速下载工具下载:Pandownload下载

    众所周知的百度网盘下载限速很厉害,所以就有了快速下载工具出现了.一般情况下,按照家里网速有多快,使用工具下载就有多快. 可以直接复制如下图进行下载: 另外,PanDownload[百度网盘下载工具]无 ...

  8. unittest===unittest 的几种执行方式

    #demo.py import requests import json class RunMain: def __init__(self, url, method, data=None): self ...

  9. advanceInstaller制作中文安装界面

    AdvanceInstaller15.7 ,上述画框选择.

  10. go 代码玩耍

    //小游戏 num := rand.Intn() var input int fmt.Println("请输入数字") fmt.Scanf("%d", & ...