11.4 基于ItemReaders的driving query 在readers 和writers章节中对数据库分页进行了讨论,很多数据库厂商,比如DB2,如果读表也需要使用的在线应用程序的其他部分,悲观锁策略,可能会导致问题.此外,打开游标在超大数据集可能导致某些供应商的问题.因此,许多项目更喜欢使用一个’Driving Query’的方式读入数据.这种方法是通过遍历keys,而不是整个对象,
6.13.2 自定义 ItemWriter 示例 自定义实现 ItemWriter 和上一小节所讲的 ItemReader 有很多方面是类似, 但也有足够多的不同之处。 但增加可重启特性在本质上是一样的, 所以本节的示例就不再讨论这一点。和 ItemReader 示例一样, 为了简单我们使用的参数也是 List: public class CustomItemWriter<T> implement
6.13.1 自定义 ItemReader 示例 为了实现这个目的,我们实现一个简单的 ItemReader, 从给定的list中读取数据。 我们将实现最基本的 ItemReader 功能, read: public class CustomItemReader<T> implements ItemReader<T>{ List<T> items; public CustomIte
到目前为止,本章已将 Spring Batch 中基本的读取(reading)和写入(writing)概念讲完, 还对一些常用的实现进行了讨论。然而,这些都是相当普通的, 还有很多潜在的场景可能没有现成的实现。本节将通过一个简单的例子,来演示如何创建自定义的ItemReader 和 ItemWriter,并且如何正确地实现和使用。 ItemReader 同时也将 ItemStream, 以说明如何
默认情况下,所有 ItemReader 和 ItemWriter 在提交之前都会把当前状态信息保存到 ExecutionContext 中。 但有时我们又不希望保存这些信息。 例如,许多开发者使用处理指示器(process indicator)让数据库读取程序 ‘可重复运行(rerunnable)’。 在数据表中添加一个附加列来标识该记录是否已被处理。 当某条记录被读取/写入时,就将标志位从 fa
在本章中, 已经讨论了很多种用来解析 input 的方法。 如果格式不对,那这些基本的实现都是抛出异常。 如果数据丢失一部分, FixedLengthTokenizer 也会抛出异常。 同样, 使用 FieldSetMapper 时,如果读取超出 RowMapper 索引范围的值,又或者返回值类型不匹配,都会抛出异常。 所有的异常都会在 read 返回之前抛出。 然而, 他们不能确定返回的item
批处理系统通常是与其他应用程序相结合的方式使用。最常见的是与一个在线应用系统结合, 但也支持与瘦客户端集成,通过移动每个程序所使用的批量数据。由于这些原因,所以很多用户想要在批处理作业中重用现有的DAO或其他服务。Spring容器通过注入一些必要的类就可以实现这些重用。但可能需要现有的服务作为 ItemReader 或者 ItemWriter, 也可以适配另一个Spring Batch类, 或其本
6.9.3 Database ItemWriters 虽然文本文件和XML都有自己特定的 ItemWriter, 但数据库和他们并不一样。这是因为事务提供了所需的全部功能。 对于文件来说 ItemWriters 是必要的, 因为如果需要事务特性,他们必须充当这种角色, 跟踪输出的 item,并在适当的时间 flushing/clearing。使用数据库时不需要这个功能,因为写已经包含在事务之中。
6.9.2 可分页的 ItemReader 另一种是使用数据库游标执行多次查询,每次查询只返回一部分结果。 我们将这一部分称为一页(a page)。 分页时每次查询必须指定想要这一页的起始行号和想要返回的行数。 JdbcPagingItemReader 分页 ItemReader 的一个实现是 JdbcPagingItemReader。 JdbcPagingItemReader 需要一个 Pagi
6.9.1 基于Cursor的ItemReaders 使用游标(cursor)是大多数批处理开发人员默认采用的方法, 因为它是处理有关系的数据“流”在数据库级别的解决方案。Java 的 ResultSet 类其本质就是用面向对象的游标处理机制。 ResultSet 维护着一个指向当前数据行的 cursor。调用 ResultSet 的 next 方法则将游标移到下一行。 Spring Batch
和大部分企业应用一样,数据库也是批处理系统存储数据的核心机制。 但批处理与其他应用的不同之处在于,批处理系统一般都运行于大规模数据集基础上。 如果一条SQL语句返回100万行, 则结果集可能全部存放在内存中m直到所有行全部读完。 Spring Batch提供了两种类型的解决方案来处理这个问题: 游标(Cursor) 和 可分页的数据库ItemReaders.
在单个 Step 中处理多个输入文件是很常见的需求。如果这些文件都有相同的格式, 则可以使用 MultiResourceItemReader 来进行处理(支持 XML/或 纯文本文件)。 假如某个目录下有如下3个文件: file-1.txt file-2.txt ignored.txt file-1.txt 和 file-2.txt 具有相同的格式, 根据业务需求需要一起处理. 可以通过 Muli
Spring Batch为读取XML映射为Java对象以及将Java对象写为XML记录提供了事务基础。 [注意]XML流的限制 StAX API 被用在其他XML解析引擎不适合批处理请求 I/O 时的情况(DOM方式把整个输入文件加载到内存中, 而SAX方式在解析过程中需要用户提供回调)。 让我们仔细看看在Spring Batch中 XML输入和输出是如何运行的。 首先,有一些不同于文件读取和写入
最常见的批量数据交换机制是使用纯文本平面文件(flat file)。 XML由统一约定好的标准来定义文件结构(即XSD), 与XML等格式不同, 想要阅读纯文本平面文件必须先了解其组成结构。一般来说,纯文本平面文件分两种类型: 有分隔的类型(Delimited) 与 固定长度类型(Fixed Length)。有分隔的文件中各个字段由分隔符进行间隔, 比如英文逗号(,)。而固定长度类型的文件每个字段
请注意, CompositeItemWriter是委托模式的一个示例, 这在Spring Batch中很常见的。 委托自身可以实现回调接口 StepListener。 如果实现了,那么他们就会被当作Job中Step的一部分与 Spring Batch Core 结合使用, 然后他们基本上必定需要手动注册到 Step 中。 一个 reader, writer, 或 processor,如果实现了 I