系统网络通信异常Read timed out排查及解决过程
用户反馈应用连接数据库经常出现网络通信异常
相关sql语句在数据库在数据库客户端能正常执行,执行时间不到1s
检查数据库参数,运行日志,网络方面,驱动版本都正常
查看应用报错日志,里面有read timd out 报错,一般是连接超时导致的
检查durid连接池配置如下
Druid 连接池connectTimeout: 和socketTimeout参数默认是10s,将这两个参数改成20000之后还是同样报错
最后将connectTimeout: 和socketTimeout改成120000,应用可以正常查询出数据,但执行时间很慢需要45s,而在客户端执行只需要0.2s,可以确认是应用里面sql执行计划不准导致。
收集统计信息,清空执行计划缓存
call sp_clear_plan_cache()
清空缓存之后,应用还是慢,通过下面查找缓存中的执行计划
select * from v$cachepln where upper(sqlstr) like '%SELECT * FROM TEST WHERE ENAME%'
alter session set events 'immediate trace name plndump level 150995946,dump_file ''/home/dmdba/new.log'''
应用端执行计划如下:
客户端执行计划如下
慢在嵌套循环,通过添加/*+enable_index_join(0)*/ 让走hash join解决,应用验证之后1s以内出结果
总结:主要原因是sql执行计划和客户端执行计划不一样导致,在应用执行时间过长导致超时报错