-
Notifications
You must be signed in to change notification settings - Fork 3.9k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
错误的SQL请求导致服务的前端连接超时 #2498
Comments
确实存在这个问题,我们之前遇到过,我来提交一个PR |
@funnyAnt |
我自己尝试修复了一下源码:
首个可见词(Hint不在其中)匹配失败就基本可以认为该SQL语法错误,之所以不立即抛出,是因为错误的组合有很多,无法做到穷举,只需将其“保驾护航”至“Druid Parse”中,由解析器去抛出具体的错误信息,即相信他人的力量。 delet select * from table_name 此语句在修复前会被匹配成
|
在某业务系统的生产环境中,执行跑批作业时报出服务的前端连接超时异常,经多次重启业务系统后重试,问题依旧。
根据分析其日志得出:在报出异常前,都有一个时间段未打印任何日志,当等待到这个时间段之后就立刻打印出异常信息,如下贴出具有代表性的日志信息:
经过与服务的各项参数比对,发现多次重试连接的这个等待时间始终稳定在 [idletimeout, idletimeout+processorCheckPeriod] 时间区间内,那么说明是请求超时导致此异常,即问题原因在于为什么会超时?
经 DBA 分析 MySQL 后表示:并无慢 SQL 产生。那么该阻塞就只能是存在于 Mycat 内部。然后通过
top
命令发现服务的 CPU 使用率高达 100%,且居高不下,再通过使用jstack PID
命令查看服务进程内部的线程栈轨迹,发现有如下栈轨迹信息:线程栈轨迹表明:名为 $_NIOREACTOR-45-RW 的线程一直运行在 DruidMycatRouteStrategy#analyseDescrSQL 方法内。分析该方法的源码后发现:该方法的循环体内部的条件分支语句没有形成完整的闭环。经与业务开发人员多次沟通和多次调试源码后发现有如下 SQL 语句进入视线。
业务开发人员在客户端手动编写 SQL 时,因疏忽把
select
少写了一个字母,未检查语法就直接发送给 mycat 服务,而此语句并未在 mycat 内部被解析成的 select 类型,而是解析成了 describe 类型,流转到了 analyseDescrSQL 方法中,但却因为该语句不是标准的 describe 类型,导致无法满足if
条件,代码又没给出默认的行为,所以形成死循环,一直占用该线程。而能够满足以上问题的错误 sql 应具有以下特征:解决思路
The text was updated successfully, but these errors were encountered: