mysql连接不释放
环境:
持久层: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默认的方式,使用路由规则去更新数据。
最新文章
- QinQ
- Integer to Roman -- LeetCode 012
- 人类大脑只开发了10%? I don't think so.
- [字符编码]Invalid byte 1 of 1-byte UTF-8 sequence终极解决方案
- iOS开发之Runtime使用
- hdu 1972.Printer Queue 解题报告
- Some settings of PostgreSQL
- [geeksforgeeks] Bottom View of a Binary Tree
- js中substr与substring的用法与区别
- books
- JBoss 系列六十九:CDI 基本概念
- iOS全角符与半角符之间的转换
- 【Linux基础】Unix与Linux操作系统介绍
- 《CoderXiaoban团队》第一次作业:团队亮相
- python的小练习
- CANOE入门(二)
- python基础(16)-进程&;线程&;协程
- lamp安装总结
- 2018 Arab Collegiate Programming Contest (ACPC 2018) E - Exciting Menus AC自动机
- c#利用SWIG调用c++dll学习总结【转】
热门文章
- TCP/IP协议族基本知识
- cocos Uniforms值的赋值
- OpenFOAM——圆筒壁稳态导热
- [Beta]Scrum Meeting#2
- [技术博客]基于动态继承类、WebDriver的浏览器兼容性测试框架搭建
- [源码分析]HashSet 和LinkedHashSet
- WIN10 删除此电脑7个文件夹-REG运行代码
- docker run 中的privileged参数
- 【Swoole】计一次swoole_server配合laravel5启动报错:Address already in use[98]
- odoo开发笔记 -- 新建模块扩展原模块增加菜单示例