Spring batch 不同数据源迁移百万级数据遇到NonSkippableReadException的解决方案

本文记录了使用Spring Batch进行不同数据源百万级数据迁移时遇到NonSkippableReadException的问题及解决过程。作者尝试了Spring Batch的内置重试机制、Step监听器以及自定义ItemReader,最终通过重启机制成功解决问题,避免了数据迁移的中断。
摘要由CSDN通过智能技术生成

Spring batch 不同数据源迁移百万级数据遇到NonSkippableReadException的解决方案

问题背景

需求特殊哈,需要从不同的数据源迁移数据,因为涉及到迁移的数据量比较大,故想使用下Spring batch来做,听说它的功能非常强大,于是就踩坑了,被按在地上摩擦了好几天哈哈,最后终于找到了好的解决方案。因国内关于此类问题的文章并不多, 故记录一下!

心路历程

  1. 使用AI chatGPT ,chatGPT给的答案真的只能当做参考,误导性比较大,特别是对于这种不太常用的技术框架;
  2. 百度搜索,基本上没有可参考的答案;
  3. 阅读官方参考文档 : 各版本地址 查看自己使用版本的参考文档就行;
  4. 啃源码;

问题原因

首先介绍下Spring batch的相关组件:
组件图
LZ的问题原因在于读取数据时因数据源数据连接不稳定的从而导致数据库连接断掉,默认Spring batch 捕获到该异常时认为该异常是不可恢复的,所以它会抛出一个它自己定义的致命的异常,即为 NonSkippableReadException ,完整的异常如下:

<#9f70370a> com.mysql.cj.exceptions.ConnectionIsClosedException: No operations allowed after connection closed.
	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(NativeConstructorAccessorImpl.java)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
	at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:61)
	at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:105)
	at com.mysql.cj.exceptions.ExceptionFactory.createException(ExceptionFactory.java:151)
	at com.mysql.cj.NativeSession.checkClosed(NativeSession.java:1171)
	at com.mysql.cj.jdbc.ConnectionImpl.checkClosed(ConnectionImpl.java:576)
	at com.mysql.cj.jdbc.ConnectionImpl.setNetworkTimeout(ConnectionImpl.java:2486)
	... 81 common frames omitted
Wrapped by: <#7b93c319> java.sql.SQLNonTransientConnectionException: No operations allowed after connection closed.
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:110)
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97)
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:89)
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:63)
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:73)
	at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:73)
	at com.mysql.cj.jdbc.ConnectionImpl.setNetworkTimeout(ConnectionImpl.java:2490)
	at com.zaxxer.hikari.pool.PoolBase.setNetworkTimeout(PoolBase.java:550)
	at com.zaxxer.hikari.pool.PoolBase.isConnectionAlive(PoolBase.java:165)
	at com.zaxxer.hikari.pool.HikariPool.getConnection(HikariPool.java:179)
	... 78 common frames omitted
Wrapped by: <#f9ccd589> java.sql.SQLTransientConnectionException: HikariPool-2 - Connection is not available, request timed out after 30039ms.
	at com.zaxxer.hikari.pool.HikariPool.createTimeoutException(Hika
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张小洛

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值