http://it.nfsq.com.cn/index.php/2016/04/06/online_problem_handle_dubbo/

首先看到dubbo-claim应用突然大面积报错,基本反馈是冻结预算出问题了,看了看冻结预算的代码,发现写的非常复杂,果断放弃看代码来排查问题。
Could not open jdbc connection for transaction: Pool empty. Unable to fetch a connection in 10 seconds, none available[size:20,busy:20; idle:0, lastwait:10000],
报错中能获得的信息是数据库的连接池满了。因为是突然报错,所以排查的主要两个方向:

  1. 调用量增大导致响应慢
  2. 数据库数据量增大导致响应慢

其他可能的小概率事件:

  1. 数据库连接未正常关闭
  2. 新上的功能比较耗时拖慢数据库
  3. 数据库有异常,或者机器网络等硬件问题(概率极小,不到最后不要想)
  4. 数据库连接是否配置小了?(20*4台一共80。假设平均处理时间在200ms,能够支撑400qps,足够了)

接下来就需要验证猜测,第一反应想看看jvm里的线程都干嘛呢,到底是谁在拖后腿,用 jstack 来打印出线程的活动状态,我是用jvisualVM来直接 dump 线程。
接下来就是看日志中的线程都干嘛呢,首先看状态为 BLOCK,和 WAITING 状态的线程,看他们是因为什么导致不执行。

"DubboServerHandler-10.3.0.87:20888-thread-152" - Thread t@229java.lang.Thread.State: BLOCKEDat com.nfsq.xs.claim.biz.budget.BudgetService.freezeBudget(BudgetService.java:85)- waiting to lock <7153f861> (a com.nfsq.xs.claim.biz.budget.BudgetService) owned by "DubboServerHandler-10.3.0.87:20888-thread-176" t@253at com.nfsq.xs.claim.biz.budget.BudgetService$$FastClassBySpringCGLIB$$8dee689c.invoke(<generated>)at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)

接下来发现日志里一个非常重要信息线程152在等线程176的一个锁(7153f861),且其他很多线程也是在等待这把锁 。
接下来看线程176这家伙拿着这把锁干嘛呢

"DubboServerHandler-10.3.0.87:20888-thread-176" - Thread t@253java.lang.Thread.State: RUNNABLEat java.net.SocketInputStream.socketRead0(Native Method)at java.net.SocketInputStream.socketRead(SocketInputStream.java:116)at java.net.SocketInputStream.read(SocketInputStream.java:170)at java.net.SocketInputStream.read(SocketInputStream.java:141)at com.mysql.jdbc.util.ReadAheadInputStream.fill(ReadAheadInputStream.java:114)at com.mysql.jdbc.util.ReadAheadInputStream.readFromUnderlyingStreamIfNecessary(ReadAheadInputStream.java:161)at com.mysql.jdbc.util.ReadAheadInputStream.read(ReadAheadInputStream.java:189)- locked <776bc7e0> (a com.mysql.jdbc.util.ReadAheadInputStream)at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:3014)at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3467)at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:3456)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3997)at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2468)at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2629)at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2719)- locked <54dd815d> (a com.mysql.jdbc.JDBC4Connection)at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)- locked <54dd815d> (a com.mysql.jdbc.JDBC4Connection)at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1379)- locked <54dd815d> (a com.mysql.jdbc.JDBC4Connection)at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:56)at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:70)at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:57)at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:267)at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:141)at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:105)at org.apache.ibatis.executor.CachingExecutor.query(CachingExecutor.java:81)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:101)at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:95)at sun.reflect.GeneratedMethodAccessor215.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.lang.reflect.Method.invoke(Method.java:497)at org.mybatis.spring.SqlSessionTemplate$SqlSessionInterceptor.invoke(SqlSessionTemplate.java:355)at com.sun.proxy.$Proxy21.selectList(Unknown Source)at org.mybatis.spring.SqlSessionTemplate.selectList(SqlSessionTemplate.java:195)at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:124)at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:90)at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:40)at com.sun.proxy.$Proxy32.listActivityWalletDTO(Unknown Source)at com.nfsq.xs.claim.service.budget.ActivityWalletOperationService.listActivityWalletDTO(ActivityWalletOperationService.java:363)at com.nfsq.xs.claim.biz.budget.BudgetService.signContract(BudgetService.java:610)at com.nfsq.xs.claim.biz.budget.BudgetService.freezeBudget(BudgetService.java:95)- locked <7153f861> (a com.nfsq.xs.claim.biz.budget.BudgetService)

看到了线程176拿了锁后最后一步执行的操作

ActivityWalletOperationService.listActivityWalletDTO

去看了代码发现对应的 SQL:

 select * from ACTIVITY_WALLETwhere source_id = '240'and source = '1';

这么简单的 SQL ,去数据看了数据量28万条,一看索引竟然只有 id 索引,source_id 查询走的全表扫描。找少炳来加了索引后,应用报错全部都没了,持续观察了两天问题解决。
最后在这里感谢@张少炳,@赵统国 @凡小梦 @马瑾 提供的帮助。

记一次线上应用数据库连接池满的处理相关推荐

  1. 记一次线上应用连接池满的处理

    记一次线上应用dubbo-claim连接池满的处理 首先看到dubbo-claim应用突然大面积报错,基本反馈是冻结预算出问题了,看了看冻结预算的代码,发现写的非常复杂,果断放弃看代码来排查问题. C ...

  2. 记几次 [线上环境] Dubbo 线程池占满原因分析(第三次:GC STW)

    [线上环境] Dubbo 线程池占满原因排查系列 记几次 [线上环境] Dubbo 线程池占满原因分析(第一次:HttpClient) 记几次 [线上环境] Dubbo 线程池占满原因分析(第二次:C ...

  3. 记一次线上coredump事故

    转自:http://www.likecs.com/show-16439.html 记一次线上coredump事故 1.事故背景 上周三凌晨,我负责的某个模块在多台机器上连续发生coredump,幸好发 ...

  4. 记一次线上环境 redis偶尔连接超时报错 解决

    记一次线上环境 redis偶尔连接超时报错 解决 贴出本地控制台日志 说实话,很痛苦,跟进很久了,一直认为的jvm程序所使用的配置的连接池框架问题 因为程序为 springboot 2 spring ...

  5. 记一次线上商城系统 Tomcat、JVM 高并发的优化

    来源:https://urlify.cn/jyYny2 对于线上系统调优,它本身是个技术活,不仅需要很强的技术实战能力,很强的问题定位,问题识别,问题排查能力,还需要很丰富的调优能力. 本篇文章从实战 ...

  6. 记一次线上商城系统高并发的优化

    对于线上系统调优,它本身是个技术活,不仅需要很强的技术实战能力,很强的问题定位,问题识别,问题排查能力,还需要很丰富的调优能力. 本篇文章从实战角度,从问题识别,问题定位,问题分析,提出解决方案,实施 ...

  7. 线上 mysql连接超时_线上环境数据库连接超时原因

    查看线上日志发现了如下的异常: ERROR 500.jsp - Error querying database.  Cause: com.mysql.jdbc.exceptions.jdbc4.Com ...

  8. Java商城首页优化_Java 实战:记一次线上商城系统高并发的优化

    对于线上系统调优,它本身是个技术活,不仅需要很强的技术实战能力,很强的问题定位,问题识别,问题排查能力,还需要很丰富的调优能力. 本篇文章从实战角度,从问题识别,问题定位,问题分析,提出解决方案,实施 ...

  9. 记一次线上redis报错(JedisExhaustedPoolException: Could not get a resource since the pool is exhausted)

    错误详情 redis.clients.jedis.exceptions.JedisExhaustedPoolException: Could not get a resource since the ...

最新文章

  1. 如何在电脑中配置jdk环境变量
  2. java final bigd_【BigData】Java基础_常量
  3. Flutter快速入门 五步搞定Flutter环境配置
  4. caffe中通过prototxt文件查看神经网络模型结构的方法
  5. 蚂蚁金服CTO程立:AI尚不具备金融级的能力,开放是突破边界唯一出路
  6. Linux 图片传输功能c/c++(初版)
  7. Xamarin效果第三篇之手机底部弹窗
  8. OGNL在Struts2中的应用
  9. HDU2012 素数判定
  10. S5PV210体系结构与接口11:NandFlash SD卡编程
  11. 水仙花数c语言程序解析,C语言求水仙花数代码解析
  12. 拓端tecdat|R语言回归中的Hosmer-Lemeshow拟合优度检验
  13. MATLAB画频率响应曲线(幅频特性和相频特性)并将横坐标转换为赫兹hz单位
  14. 求点到直线距离,可以分辨点在直线左边还是右边
  15. Photoshop平面设计:网页设计之论摹仿和抄袭——xiame.com
  16. Material Design ui设计风格详解
  17. X86服务器CPU的作用,为什么需要基于x86架构的至强处理器?
  18. 【python数据结构】多维数组
  19. CTFShow“萌心区”WP(上)
  20. win10有信号没有网络连接到服务器,win10系统显示网络连接正常但没有网络,无法上网的办法介绍...

热门文章

  1. HDU-2778 LCR
  2. 判断字符串是否是字母开头数字结尾,拆分字符串中的字母和数字。
  3. 协同合作、项目管理、社会化商业······2014年最值得关注的六大趋势
  4. 低延时实时音视频在5G远程操控场景的应用实践
  5. 4款绝赞的安卓小说app,免费且书源超强!
  6. 网上美女是这样练成的(转)
  7. npm-shrinkwrap锁定依赖
  8. 过程设计工具:判定表、判定树-----重点
  9. 【完结】中国12大AI研究院,高调的低调的你pick谁
  10. 中小企业网络推广必走的七步法