Spring Batch对接Azure SQL Server偶现连接关闭无响应如何解决
错误含义
该报错是应用程序向Azure SQL Server发起数据库操作时,使用的JDBC连接已经被断开导致的。触发的核心原因是你当前是超2小时的长运行任务,连接在空闲阶段被Azure SQL服务端、中间网络设备(如防火墙、负载均衡)主动回收了,但本地Hikari连接池没有及时感知到连接已失效,将无效连接分配给业务操作就会抛出该错误。
修复方案
- 补充Hikari连接池的有效性校验配置
你的现有Hikari配置缺失连接保活、有效性校验逻辑,新增如下配置即可解决绝大多数无效连接问题:
<bean id="hikariConfig" class="com.zaxxer.hikari.HikariConfig"> <property name="maximumPoolSize" value="50" /> <property name="idleTimeout" value="30000" /> <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" /> <property name="url" value="jdbc:sqlserver://demo.database.windows.net:1433;database=sqldb;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;socketTimeout=60000;" /> <property name="username" value="user1" /> <property name="password" value="p@ssword1" /> <!-- 新增以下配置 --> <!-- 连接校验语句,用于检测连接是否存活 --> <property name="connectionTestQuery" value="SELECT 1" /> <!-- 连接校验超时时间5秒 --> <property name="validationTimeout" value="5000" /> <!-- 连接保活间隔20分钟,小于Azure SQL默认30分钟的空闲连接超时阈值,定期发送心跳避免连接被回收 --> <property name="keepaliveTime" value="1200000" /> <!-- 连接最大生命周期1小时,超过时间自动销毁重建,避免连接被服务端强制断开 --> <property name="maxLifetime" value="3600000" /> </bean>
- 优化事务粒度与写入逻辑
你的自定义StoreWriter嵌套处理批量数据,容易导致单事务持有连接时间过长,建议调整Spring Batch Step的Chunk大小,直接使用原生HibernateItemWriter按Chunk粒度提交事务,避免长事务长时间占用连接。 - 检查Azure SQL资源使用情况
排查任务运行时Azure SQL的DTU/VCore、连接数、IO等指标是否达到阈值,服务端侧是否有主动断开连接的策略,按需调整Azure SQL的配置规格。
内容的提问来源于stack exchange,提问作者One Developer
相关产品推荐
相关产品推荐

