Spring Batch执行X步骤时出现MySQL连接超时SocketException问题求助
Spring Batch Step抛出java.net.SocketException连接超时(源库查询最近1分钟数据时)
问题描述
运行包含1个Job和多个Step的Spring Batch任务,前序Step执行正常,但进入X Step后,执行从源数据库查询最近1分钟数据并写入目标数据库的逻辑时,抛出java.net.SocketException连接超时异常。
已尝试操作:
- 优化查询语句
- 调整数据库连接超时参数
问题仍未解决,以下是相关信息:
异常栈追踪
# 此处粘贴完整异常栈信息
pom.xml核心配置
<!-- 此处粘贴pom.xml中Spring Batch、数据库驱动等相关配置 -->
application.yml数据源配置
# 此处粘贴数据源相关配置
MySQL my.cnf配置
# 此处粘贴my.cnf核心配置
排查与解决方案建议
1. 网络层面验证
- 检查源数据库服务器的防火墙/安全组规则,确认当前应用服务器IP是否被允许访问,且无时段性限流策略
- 查看源服务器网络负载:执行
netstat -anp | grep 3306(Linux)或对应Windows命令,检查TCP连接队列是否有积压,是否存在大量TIME_WAIT/CLOSE_WAIT状态连接 - 持续测试网络连通性:在应用服务器上执行
ping <源库IP>和telnet <源库IP> 3306,观察是否有丢包、延迟突增或连接中断情况
2. 连接池配置校验
- 确认X Step是否使用独立连接池,检查
maxActive、minIdle参数是否匹配业务负载,避免连接耗尽导致等待超时 - 确保连接超时参数完整配置:
connectTimeout(数据库连接建立超时)socketTimeout(数据传输超时)connectionTimeout(连接池获取连接超时)- 开启连接有效性验证:设置
validationQuery: SELECT 1并启用testWhileIdle,避免使用已被MySQL关闭的无效连接
3. MySQL服务器端配置检查
- 核对
wait_timeout和interactive_timeout参数值,若远小于任务执行间隔,会导致MySQL主动关闭闲置连接,触发后续操作超时 - 检查
max_connections参数是否达到上限,可通过SHOW GLOBAL STATUS LIKE 'Max_used_connections';查看历史峰值 - 查看MySQL慢查询日志,确认X Step的查询是否真的完成优化,是否存在隐性锁等待或未命中索引的情况
4. Spring Batch Step专属配置调整
- 检查X Step的
chunk大小,若过大可能导致单次数据处理时间过长,触发套接字超时,可尝试缩小chunk值 - 确认Step的事务超时时间是否合理,避免因事务执行时间超过阈值被强制中断
- 排查X Step中是否存在额外网络操作(如日志上报、第三方调用),此类操作可能抢占网络资源,导致数据库连接超时
5. 复现与日志细化
- 在应用服务器上手动执行X Step的查询语句,验证是否能正常返回结果,排除代码逻辑外的问题
- 开启数据库驱动DEBUG日志(如
com.mysql.cj.jdbc包日志级别设为DEBUG),查看连接建立、数据传输的详细过程,定位超时发生的具体阶段
内容的提问来源于stack exchange,提问作者VittoN
相关产品推荐
相关产品推荐

