jdbc设置StatementTimeout后还需要设置socket timeout参数吗

背景

我们设置JDBC参数时,不管有没有在Statement中配置超时时间StatementTimeout,我们都需要配置jdbc的socket timeout参数,那么为什么这个socket timeout参数如此必要,不设置又会怎么样?

问题真相

首先设置了StatementTimeout只是表示如果sql的超时时间到了,会通过socket发送Cancel指令给mysql取消超时语句的执行,但是如果此时网络有问题,导致Cancel执行在网络中的某个地方被交换机hold住,那么此时jdbc连接就会进入等待状态,等待的时间由min(socket timeout, keepalive timeout)的最小值决定,下面的图展示了设置socket timeout参数和不设置socket timeout参数时jdbc连接的情况

从图中可知,为了防止出现网络问题时,尽快释放有问题的jdbc连接并重建,我们需要配置socket timeout参数,并且配置值不能太长

相关推荐
霸道流氓气质几秒前
Spring AI 多租户隔离方案
java·人工智能·spring
学逆向的4 分钟前
扩展PE头属性说明
开发语言·网络安全·pe
不会就选b5 分钟前
Linux之socket编程(七)----序列化与反序列化(1)
java·linux·服务器
秋名RG8 分钟前
Java 工程师学习路线
java·学习方法
秋名RG12 分钟前
Java 基础语法
java·开发语言
java1234_小锋15 分钟前
MyBatis-Plus 3.5.15 已全面支持 Spring Boot 4.0 及 Jackson 3.0
java·spring boot·mybatis
码行山野赴时序归途17 分钟前
C 语言文件操作完全指南:从打开到关闭
c语言·开发语言
2501_9378609423 分钟前
Java 文件操作与IO(下):字节流、字符流实战IO读写
java·开发语言·python
xixingzhe225 分钟前
spring boot项目接口访问慢问题解决方案
java·数据库·spring boot
MetaLite28 分钟前
SpringBoot整合FastJson2数据脱敏-接口日志与失败降级
java·spring boot·后端