在 Spring 批处理应用程序中使用 BufferWriter 处理回滚
Handling rollback using BufferWriter in Spring Batch Applications
在我的用例中,我想使用缓冲区编写器来处理字符串的存储。
- 只有满足提交间隔时,才会刷新写入
这是为了确保当读取出错时,缓冲区写入器能够处理回滚。
有没有这方面的例子或帮助,因为这是我第一次做 spring 启动应用程序。
谢谢!
除非您有事务性文件系统,否则您无法回滚磁盘 flush
操作。由于问题的难度,事务文件系统从未成为主流。 Microsoft 试图在 Java 世界中提供 one, but this was abandoned quickly. There used be a couple of APIs for that as well, like Apache commons-transaction,但由于缺乏事务性文件系统,这些不再得到维护。
ACID 兼容数据库是在常规文件系统之上添加事务语义的方式。 SQLite 是使用最广泛的一个,它是 IMO 的一个了不起的工程。您可以看到如何将 SQLite 用作 application file format.
这就是为什么 Spring Batch 无法真正回滚刷新操作的原因,这将我带到下一点它如何处理回滚..
i would like to use a buffer writer to handle the storing of strings. Only when the commit interval has been met, it will flush the writes
这已在 Spring 批处理提供的 FlatFileItemWriter
中实现,默认情况下使用 TransactionawareBufferedWriter。这个缓冲的写入器知道当前活动的事务,并在满足块大小时将项目刷新到磁盘之前缓冲项目。
在刷新缓冲区后回滚事务这种不太可能的情况下,作业将被标记为失败,您可以重新启动它。重新启动时,Spring Batch 会将损坏的文件截断到最后一个已知的“好”字节偏移量,并重新开始对最后一个失败的块进行干净写入,然后从那里继续。
在我的用例中,我想使用缓冲区编写器来处理字符串的存储。
- 只有满足提交间隔时,才会刷新写入
这是为了确保当读取出错时,缓冲区写入器能够处理回滚。
有没有这方面的例子或帮助,因为这是我第一次做 spring 启动应用程序。
谢谢!
除非您有事务性文件系统,否则您无法回滚磁盘 flush
操作。由于问题的难度,事务文件系统从未成为主流。 Microsoft 试图在 Java 世界中提供 one, but this was abandoned quickly. There used be a couple of APIs for that as well, like Apache commons-transaction,但由于缺乏事务性文件系统,这些不再得到维护。
ACID 兼容数据库是在常规文件系统之上添加事务语义的方式。 SQLite 是使用最广泛的一个,它是 IMO 的一个了不起的工程。您可以看到如何将 SQLite 用作 application file format.
这就是为什么 Spring Batch 无法真正回滚刷新操作的原因,这将我带到下一点它如何处理回滚..
i would like to use a buffer writer to handle the storing of strings. Only when the commit interval has been met, it will flush the writes
这已在 Spring 批处理提供的 FlatFileItemWriter
中实现,默认情况下使用 TransactionawareBufferedWriter。这个缓冲的写入器知道当前活动的事务,并在满足块大小时将项目刷新到磁盘之前缓冲项目。
在刷新缓冲区后回滚事务这种不太可能的情况下,作业将被标记为失败,您可以重新启动它。重新启动时,Spring Batch 会将损坏的文件截断到最后一个已知的“好”字节偏移量,并重新开始对最后一个失败的块进行干净写入,然后从那里继续。