环境:

  持久层: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默认的方式,使用路由规则去更新数据。

  

最新文章

  1. QinQ
  2. Integer to Roman -- LeetCode 012
  3. 人类大脑只开发了10%? I don't think so.
  4. [字符编码]Invalid byte 1 of 1-byte UTF-8 sequence终极解决方案
  5. iOS开发之Runtime使用
  6. hdu 1972.Printer Queue 解题报告
  7. Some settings of PostgreSQL
  8. [geeksforgeeks] Bottom View of a Binary Tree
  9. js中substr与substring的用法与区别
  10. books
  11. JBoss 系列六十九:CDI 基本概念
  12. iOS全角符与半角符之间的转换
  13. 【Linux基础】Unix与Linux操作系统介绍
  14. 《CoderXiaoban团队》第一次作业:团队亮相
  15. python的小练习
  16. CANOE入门(二)
  17. python基础(16)-进程&线程&协程
  18. lamp安装总结
  19. 2018 Arab Collegiate Programming Contest (ACPC 2018) E - Exciting Menus AC自动机
  20. c#利用SWIG调用c++dll学习总结【转】

热门文章

  1. TCP/IP协议族基本知识
  2. cocos Uniforms值的赋值
  3. OpenFOAM——圆筒壁稳态导热
  4. [Beta]Scrum Meeting#2
  5. [技术博客]基于动态继承类、WebDriver的浏览器兼容性测试框架搭建
  6. [源码分析]HashSet 和LinkedHashSet
  7. WIN10 删除此电脑7个文件夹-REG运行代码
  8. docker run 中的privileged参数
  9. 【Swoole】计一次swoole_server配合laravel5启动报错:Address already in use[98]
  10. odoo开发笔记 -- 新建模块扩展原模块增加菜单示例