环境:

  持久层: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. 洛谷 P1873 【砍树】

    P1873 传送门 题外话 话说我们也要当一当光头强?? 大体题意 就是让你砍树,统一的高度,然后让你砍树,看看订什么高度合适. 思路: 二分答案,对高度二分,如果砍得树长度不够,那就说明高度高了. ...

  2. 自建 ca 及使用 ca 颁发证书

    创建CA: 一.安装openssl [root@localhost ~]# yum install -y openssl 二.创建CA的相关文件及目录 mkdir /opt/root_ca & ...

  3. AttributeError: module ‘select’ has no attribute 'epoll’

    场景:mac 下导入的 ‘select’ 包 import select,然后在 主函数 中创建的 epoll 对象 epl = select.epoll(),运行报错如下 Traceback (mo ...

  4. Codeforces 828F Best Edge Weight - 随机堆 - 树差分 - Kruskal - 倍增算法

    You are given a connected weighted graph with n vertices and m edges. The graph doesn't contain loop ...

  5. 理解Docker :Docker 网络

    本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  6. java.lang.IllegalArgumentException: host parameter is null

    即 URL 应为 http://www.baidu.com  但是实际配置成了  www.baidu.com 所以出现此错误

  7. Future home of something quite cool.

    我绑定二级域名的时候显示内页如下,怎么办??一级主域名没问题呀~ Future home of something quite cool.If you're the site owner, log i ...

  8. docker 镜像制作(jupyter)

    docker pull centosdocker run -it -d --name test-centos1 centosdocker exec -it test-centos1 /bin/bash ...

  9. config:fail,Error: 系统错误,错误码:63002,invalid signature [20191104 17:18:1

    需要检查下后端有没有缓存到redis.这个很重要不然也会报这个错

  10. odoo开发笔记 -- odoo权限管理

    odoo框架 整体权限可以分为4个级别: (1) 菜单级别: 不属于指定菜单所包含组的用,看不到相应菜单.不安全,只是隐藏菜单,若用户知道菜单ID,仍然可以通过指定URL访问(2) 对象级别: 对某个 ...