取消超时执行的sql
在线上 有些sql执行的比较慢,希望可以指定超时时间, 取消这个sql的执行,以下以druid为例为实现这个功能 jdbc 有2个超时时间, 一个是queryTimeout, 一个是socketTimeout, queryTimeout的作用是sql执行超时之后,可以取消这次的执行,底层原理是发送kill $id通知mysql来中断这个sql的执行 socketTimeout的作用主要是为了解决tcp连接超时的问题, 超时之后,这个tcp连接会断开 要注意的是,socket超时只是释放tcp链接, 但sql还是在mysql里面执行(可以通过show processlist来看到) 所以为了取消sql的执行,socketTimeout的时间一定要大于queryTimeout才有意义 queryTimeout会抛出异常com.mysql.jdbc.exceptions.MySQLTimeoutException: Statement cancelled due to timeout or client request socketTimeout会抛出异常com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet successfully