springbatchitemwriter详解
spring batch item writer详解
github地址:
⽂章列表:
ItemWrite
spring batch通过Tasklet完成具体的任务,chunk类型的tasklet定义了标准的读、处理、写的执⾏步骤。ItemWriter是实现写的重要组件,spring batch框架提供了丰富的写基础设施来完成各种数据源的写⼊功能。
spring batch框架默认提供了丰富的Writer实现;如果不能满⾜需求可以快速⽅便地实现⾃定义的数据写⼊;对于已经存在的持久化服务,框架提供了复⽤现有服务的能⼒,避免重复开发。
spring batch框架通常针对⼤数据量进⾏处理,同时框架需要讲作业处理的状态实时地持久化到数据库中,如果读取⼀条记录就进⾏写操作或者状态数据的提交,会⼤量消耗系统资源,导致批处理框架性能较差。在⾯向批处理chunk的操作中,可以通过属性commit-interval设置read多少条记录后进⾏⼀次提交。通过设置commit-interval的间隔值,减少提交频次,降低资源使⽤率。
ItemWriter
ItemWriter是Step中对资源的写处理阶段,spring batch框架已经提供了各种类型的写实现。
所有的写操作需要实现ItemWriter接⼝
写操作的参数是⼀个List,所以通常情况下是批量写⼊。
ItemStream
spring batch框架童年时提供了另外⼀个重要的接⼝ItemStream。ItemStream接⼝定义了写操作与执⾏上下⽂ExecutionContext交互的能⼒。可以将已经写的条数通过该接⼝存放在执⾏上下⽂ExecutionContext中(ExecutionContext中的数据在批处理commit的时候会通过JobRepository持久化到数据库中),这样到Job发⽣异常重新启动Job的时候,写操作可以跳过已经成功写过的数据,继续从上次出错的地⽅(可以从执⾏上下⽂中获取上次成功写的位置)继续写。
ItemStream接⼝
open操作根据参数executionContext打开需要读取资源的stream;可以根据持久化在执⾏上下⽂exec
utionContext中的数据重新定位需要写⼊记录的位置。
update操作将需要持久化的数据存放在执⾏上下⽂executionContext中
close操作关闭读取的资源
系统写组件
spring batch框架提供的写组件
ItemWriter说明
FlatFileItemWriter写Flat类型⽂件
MultiResourceItemWriter多⽂件写组件
StaxEventItemWriter写XML类型⽂件
AmqpItemWriter写AMQP类型消息
ClassifierCompositeItemWriter根据Classifier路由不同的Item到特定的ItemWriter处理
HibernateItemWriter基于Hibernate⽅式写数据库
IbatisBatchItemWriter基于Ibatis⽅式写数据库
ItemWriterAdapter ItemWriter适配器,可以复⽤现有的写服务
JdbcBatchItemWriter基于JDBC⽅式写数据库
JmsItemWriter写JMS队列
JpaItemWriter基于Jpa⽅式写数据库
GemfireItemWriter基于分布式数据库Gemfire的写组件
SpELMappingGemfireItemWriter基于spring表达式语⾔写分布式数据库Gemfire的组件
MimeMessageItemWriter发送邮件的写组件
MongoItemWriter基于分布式⽂件存储的数据库MongoDB写组件
Neo4jItemWriter⾯向⽹络的数据库Neo4j的写组件
PropertyExtractingDelegatingItemWriter属性抽取代理写组件:通过调⽤给定的spring bean⽅法执⾏写⼊,参数有Item中指定的属性字段作为参数
RepositoryItemWriter基于spring Data的写组件
SimpleMailMessageItemWriter发送邮件的写组件
CompositeItemWriter条⽬写的组合模式,⽀持组装多个ItemWriter
ItemWriter说明
写数据库
spring batch框架对于写数据库提供了较好的⽀持,包括基于JDBC和ORM的写⼊⽅式。
JdbcBatchItemWriter
spring batch框架提供了对JDBC谢⽀持的组件JdbcBatchItemWriter。JdbcBatchItemWriter实现了ItemWriter接⼝,将Item对象转换为数据库中的记录。
JdbcBatchItemWriter对⽤户屏蔽了数据库访问的操作细节,且提供了批处理的特性,JdbcBatchItem
Writer会批量执⾏⼀组SQL语句来提⾼性能,⽽不是逐条执⾏SQL语句,每次批量提交的语句数和chunk中定义的提交间隔是⼀致的。
JdbcBatchItemWriter关键接⼝
关键类说明
DataSource提供写⼊数据库的数据源信息
ItemPreparedStatementSetter为SQL语句中有"?"的参数提供赋值接⼝ColuniMapItemPreparedStatementSetter接⼝ItemPreparedStatementSetter的实现类,提供基于列的参数设置ItemSqlParameterSourceProvider为SQL语句中有命名的参数提供赋值接⼝BeanPropertyItemSqlParameterSourceProvider从给定的Item中根据参数名称获取Item对应的属性值作为参数NamedParameterJdbcOperations JdbcTemplate操作,提供执⾏SQL的能⼒JdbcBatchItemWriter关键属性
JdbcBatchItemWriter属性类型说明
dataSourec DataSource数据源,通过该属性指定使⽤的数据库信息sql String执⾏的SQL语句itemSqlParameterSourceProvider ItemSqlParameterSourceProvider为SQL语句中有命名的参数提供
赋值
itemPreparedStatementSetter ItemPreparedStatementSetter为SQL语句中有"?"的参数提供赋值assertUpdates Boolean当没有修改、删除⼀条记录时,是否抛出异常。默认抛出
使⽤JdbcBatchItemWriter⾄少需要配置dataSource,sql两个属性。dataSourec指定访问的数据源,sql⽤于指定处查询的SQL语句。⾸先我们在数据库中创建表
接着创建JdbcBatchItemWriter的写⼊组件
然后使⽤这个写⼊器,完整代码
@EnableBatchProcessing
@Configuration
public class JdbcBatchItemWriterJobConf {
@Bean
public String runJob(JobLauncher jobLauncher, Job job)throws JobParametersInvalidException, JobExecutionAlreadyRunningException, JobRestartExc eption, JobInstanceAlreadyCompleteException {
jobLauncher.run(job,new JobParametersBuilder()
.addDate("date",new Date()).toJobParameters());
return"";
}
@Bean
public Job job(JobBuilderFactory jobBuilderFactory, Step step){
("jdbc-batch-item-writer-step")
.start(step)
.build();
}
@Bean
public Step step(StepBuilderFactory stepBuilderFactory, JdbcBatchItemWriter<People> writer){
AtomicLong atomicLong =new AtomicLong();
("jdbc-batch-item-writer-step")
.<People, People>chunk(3)
.reader(()-> ()>20? null :new People(null,"name : "+ AndIncrement()))
.processor((Function<People, People>) item ->{
System.out.println("process : "+ item);
return item;
})
.writer(writer)
.build();
}
@Bean
public JdbcBatchItemWriter<People>writer(DataSource dataSource){
return new JdbcBatchItemWriterBuilder<People>()
.dataSource(dataSource)
.sql("insert into people(id,name) values(null,?)")
.itemPreparedStatementSetter(((item, ps)-> ps.setString(1, Name())))
.assertUpdates(false)
.build();
jpa mybatis}
}
执⾏结果
数据库中查看结果
我们这⾥使⽤的是问号,也可以使⽤变量名
这次少写⼊点,写⼊10个
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论