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

Spring Batch使用Azure SQL性能不稳定,执行时长差异大如何解决?

性能差异根因

从你提供的两组Hibernate性能统计可以直接定位:耗时差异完全集中在JDBC语句执行、缓存刷写两个阶段,连接获取、SQL预处理阶段耗时几乎无区别,说明瓶颈100%出在Azure SQL侧,和应用代码运行环境无关。
导致Azure SQL性能波动的常见原因:

  • 你使用的是Azure SQL无服务器层/低配置通用层,这类规格会出现资源争抢、限流、自动唤醒延迟等问题,高峰时段性能会大幅下降。
  • 目标表存在锁等待:同一时段有其他业务对该表进行读写操作,导致插入请求等待锁释放,耗时升高。
  • 你的写入配置本身效率极低:统计中显示0 nanoseconds spent executing 0 JDBC batches,说明Hibernate没有开启批处理,6000条数据都是单条插入,非常容易受数据库性能波动影响。

优化方案

1. 解决Azure SQL性能波动

  • 把Azure SQL从无服务器层切换为预配层,预留固定vCore和IO资源,避免租户间资源争抢和自动暂停带来的延迟。
  • 开启Azure SQL查询存储,监控慢执行时段的等待事件,确认是否存在锁等待、IO限流问题,针对性调整表结构和业务执行时间。
  • 优化目标表结构:确保插入的表有自增主键,插入前临时禁用不必要的非聚集索引、触发器,插入完成后再重建,减少插入时的额外开销。

2. 优化应用写入配置,降低波动影响

你当前未开启Hibernate批处理是写入效率低的核心问题,在Hibernate配置中新增以下参数:

<prop key="hibernate.jdbc.batch_size">100</prop>
<prop key="hibernate.order_inserts">true</prop>

和你现有的commit-interval=100对齐后,每100条插入会合并为一次批量请求,JDBC请求数从6000次降到60次,写入效率会提升数倍,也会大幅降低数据库侧波动对整体耗时的影响。
另外你当前使用的DriverManagerDataSource没有连接池功能,建议替换为HikariCP连接池,避免连接创建开销:

<bean id="irusDataSource" class="com.zaxxer.hikari.HikariDataSource">
    <property name="driverClassName" value="com.microsoft.sqlserver.jdbc.SQLServerDriver" />
    <property name="jdbcUrl" value="jdbc:sqlserver://sqlserver85.database.windows.net:1433;database=sqldb;encrypt=true;trustServerCertificate=false;hostNameInCertificate=*.database.windows.net;loginTimeout=30;" />
    <property name="username" value="ddddd" />
    <property name="password" value="`JNp" />
    <property name="maximumPoolSize" value="5" />
    <property name="minimumIdle" value="2" />
</bean>

3. 可选调整

如果后续数据量增长,可以将commit-interval调整为500~1000,进一步减少事务提交次数,注意和hibernate.jdbc.batch_size保持倍数关系即可。


内容的提问来源于stack exchange,提问作者One Developer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 10:36:06