java - 在 Spring Batch 应用程序中使用 BufferWriter 处理回滚
问题描述
在我的用例中,我想使用缓冲区编写器来处理字符串的存储。
- 仅当满足提交间隔时,才会刷新写入
这是为了确保当读取出现错误时,缓冲区写入器能够处理回滚。
是否有任何示例或帮助,因为这是我第一次做 Spring Boot 应用程序。
谢谢!
解决方案
除非您有事务文件系统,否则您无法回滚磁盘flush
操作。由于问题的难度,事务性文件系统从未成为主流。微软试图提供一个,但很快就被放弃了。也有一些 API 用于此目的,例如Java 世界中的Apache commons-transaction,但由于缺乏事务文件系统,这些 API 不再维护。
符合 ACID 的数据库是在常规文件系统之上添加事务语义的方法。SQLite 是使用最广泛的一种,它是 IMO 的一项了不起的工程。您可以看到 SQLite 如何用作应用程序文件格式。
这就是为什么 Spring Batch 不能真正回滚刷新操作,这让我想到了它如何处理回滚的下一点。
我想使用缓冲区编写器来处理字符串的存储。仅当满足提交间隔时,才会刷新写入
这已经在FlatFileItemWriter
Spring Batch 提供的中实现,默认情况下它使用TransactionawareBufferedWriter。这个缓冲的写入器知道当前活动的事务,并在满足块大小时缓冲项目,然后将它们刷新到磁盘。
在缓冲区刷新后事务回滚的不太可能的情况下,作业将被标记为失败,您可以重新启动它。在重新启动时,Spring Batch 会将损坏的文件截断到最后一个已知的“好”字节偏移量,并重新开始对最后一个失败的块进行干净写入,然后从那里继续。
推荐阅读
- conv-neural-network - 具有附加对象识别功能的 ARCore
- oauth-2.0 - OAuth 2 授权代码流的 OpenAPI/Swagger 规范
- java - 返回数组的更好方法是什么?
- javascript - 带有淡入黑色过渡的图像轮播
- python - Python:搜索同一类的对象列表以确定 object.attribute 等于列表中任何对象的某个值
- 3d - 围绕其坐标旋转对象
- python - VS Code中的python烧瓶不会在断点处停止
- c - 字符 C 函数,对其行为的误解
- polymer - babel 将 ES6 转译为 ES5 时方法未定义
- python - 用掩码元素取 numpy ndarray 的平均值