You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 04:00:00