如何解决在 Spring Batch 应用程序中使用 BufferWriter 处理回滚
在我的用例中,我想使用缓冲区编写器来处理字符串的存储。
- 只有在达到提交间隔时,才会刷新写入
这是为了确保当读取出错时,缓冲区写入器能够处理回滚。
有没有这方面的例子或帮助,因为这是我第一次做 Spring Boot 应用程序。
谢谢!
解决方法
除非您拥有事务性文件系统,否则无法回滚磁盘 flush
操作。由于问题的难度,事务性文件系统从未成为主流。 Microsoft 试图提供 one,但很快就放弃了。为此也使用了一些 API,例如 Java 世界中的 Apache commons-transaction,但由于缺少事务性文件系统,这些 API 不再维护。
符合 ACID 的数据库是在常规文件系统之上添加事务语义的方法。 SQLite 是使用最广泛的一个,这是 IMO 的一项了不起的工程。您可以看到如何将 SQLite 用作 application file format。
这就是 Spring Batch 不能真正回滚刷新操作的原因,这让我想到了它如何处理回滚的下一点..
我想使用缓冲区编写器来处理字符串的存储。只有在达到提交间隔时,才会刷新写入
这已经在 Spring Batch 提供的 FlatFileItemWriter
中实现,它默认使用 TransactionawareBufferedWriter。这个缓冲写入器知道当前活动的事务,并在满足块大小时在将项目刷新到磁盘之前缓冲它们。
在不太可能的情况下,事务回滚 缓冲区被刷新后,作业将被标记为失败,您可以重新启动它。在重新启动时,Spring Batch 会将损坏的文件截断到最后一个已知的“好”字节偏移量,并重新启动最后一个失败块的干净写入,然后从那里继续。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。