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
相关产品推荐
相关产品推荐

