Spring batch Spring批处理java.io.IOException:流关闭错误
我有10个文本文件,其中包含要插入数据库的XML。每个文件大小约为113 MB。在读取了5-6个文件之后,我得到了“java.io.IOException:streamclosed”错误。下面是我的Spring批处理配置。你能建议我如何纠正这个问题吗Spring batch Spring批处理java.io.IOException:流关闭错误,spring-batch,Spring Batch,我有10个文本文件,其中包含要插入数据库的XML。每个文件大小约为113 MB。在读取了5-6个文件之后,我得到了“java.io.IOException:streamclosed”错误。下面是我的Spring批处理配置。你能建议我如何纠正这个问题吗 <bean id="gimReader" class="org.springframework.batch.item.file.MultiResourceItemReader" scope="step">
<bean id="gimReader"
class="org.springframework.batch.item.file.MultiResourceItemReader"
scope="step">
<property name="delegate">
<bean class="org.springframework.batch.item.file.FlatFileItemReader">
<property name="lineMapper">
<bean
class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
<property name="lineTokenizer">
<bean
class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
<property name="names" value="gimDataStr" />
</bean>
</property>
<property name="fieldSetMapper">
<bean
class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
<property name="prototypeBeanName" value="gimDataBean" />
</bean>
</property>
</bean>
</property>
</bean>
</property>
<property name="resources" value="file:C:/Vet/XMLtype/SampleData/*.sql" />
</bean>
<bean id="gimDataBean" class="com.jpmorgan.batch.standinginstruction.model.GimDataBean" scope="prototype"/>
<bean id="jdbcWriter" class="org.springframework.batch.item.database.JdbcBatchItemWriter">
<property name="itemSqlParameterSourceProvider">
<bean class="org.springframework.batch.item.database.BeanPropertyItemSqlParameterSourceProvider" />
</property>
<property name="sql" value="INSERT INTO GIMDATA (GIM_DATA) VALUES(:gimDataStr)" />
<property name="dataSource" ref="dataSource" />
</bean>
<batch:job id="gimId">
<batch:step id="import">
<batch:tasklet task-executor="simpleTaskExecutor" throttle-limit="20">
<batch:chunk reader="gimReader" writer="jdbcWriter"
commit-interval="500">
</batch:chunk>
</batch:tasklet>
</batch:step>
</batch:job>
<bean id="simpleTaskExecutor" class="org.springframework.core.task.SimpleAsyncTaskExecutor">
<property name="concurrencyLimit" value="20" />
</bean>
谢谢
Sach您使用的是带状态(1)读取器(multiresourceitemreader)的,对于您的用例,您可以使用
1) 从spring批处理多线程步骤:
使用多线程步骤来执行以下操作存在一些实际限制:
一些常见的批处理用例。步骤中的许多参与者(例如,读者
和写入程序)是有状态的,如果该状态未被
线程,则这些组件在多线程步骤中不可用。
特别是大多数现成的读者和作者
Spring Batch不是为多线程使用而设计的
谢谢你,迈克尔。使用分区,我可以在大约3分钟内加载700000条记录。我还有什么可以改进时间安排的吗?我的分区网格大小是20,提交间隔是2000。我正在使用SimpleAsynctaskeExecutor。尝试批量插入(或批量插入),提高数据库连接计数(结合池),我确实将数据库连接提高到了50。我已经将提交间隔设置为2000,这意味着每过2000条记录数据都会提交到数据库中,因此我认为这是作为buld insert工作的。jdbcbatchitemwriter已经使用jdbc批处理api,尝试分析以找到更多瓶颈,我将使用jdbcbatchitemwriter删除反射严重的BeanwrapPerfiedSetMapPeri am以插入数据库。BeanWrapperFieldsetMapper有其他选择吗?
at org.springframework.batch.item.file.FlatFileItemReader.readLine(FlatFileItemReader.java:219)
at org.springframework.batch.item.file.FlatFileItemReader.doRead(FlatFileItemReader.java:172)
at org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.read(AbstractItemCountingItemStreamItemReader.java:85)
at org.springframework.batch.item.file.MultiResourceItemReader.readNextItem(MultiResourceItemReader.java:119)
at org.springframework.batch.item.file.MultiResourceItemReader.read(MultiResourceItemReader.java:108)
at sun.reflect.GeneratedMethodAccessor20.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:309)
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)
at org.springframework.aop.support.DelegatingIntroductionInterceptor.doProceed(DelegatingIntroductionInterceptor.java:131)
at org.springframework.aop.support.DelegatingIntroductionInterceptor.invoke(DelegatingIntroductionInterceptor.java:119)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)
at $Proxy25.read(Unknown Source)
at org.springframework.batch.core.step.item.SimpleChunkProvider.doRead(SimpleChunkProvider.java:90)
at org.springframework.batch.core.step.item.SimpleChunkProvider.read(SimpleChunkProvider.java:148)
at org.springframework.batch.core.step.item.SimpleChunkProvider$1.doInIteration(SimpleChunkProvider.java:108)
at org.springframework.batch.repeat.support.RepeatTemplate.getNextResult(RepeatTemplate.java:367)
at org.springframework.batch.repeat.support.RepeatTemplate.executeInternal(RepeatTemplate.java:214)
at org.springframework.batch.repeat.support.RepeatTemplate.iterate(RepeatTemplate.java:143)
at org.springframework.batch.core.step.item.SimpleChunkProvider.provide(SimpleChunkProvider.java:103)
at org.springframework.batch.core.step.item.ChunkOrientedTasklet.execute(ChunkOrientedTasklet.java:68)
at org.springframework.batch.core.step.tasklet.TaskletStep$ChunkTransactionCallback.doInTransaction(TaskletStep.java:386)
at org.springframework.transaction.support.TransactionTemplate.execute(TransactionTemplate.java:130)
at org.springframework.batch.core.step.tasklet.TaskletStep$2.doInChunkContext(TaskletStep.java:264)
at org.springframework.batch.core.scope.context.StepContextRepeatCallback.doInIteration(StepContextRepeatCallback.java:76)
at org.springframework.batch.repeat.support.TaskExecutorRepeatTemplate$ExecutingRunnable.run(TaskExecutorRepeatTemplate.java:258)
at org.springframework.core.task.SimpleAsyncTaskExecutor$ConcurrencyThrottlingRunnable.run(SimpleAsyncTaskExecutor.java:229)
at java.lang.Thread.run(Thread.java:662)
Caused by: java.io.IOException: Stream closed
at java.io.BufferedReader.ensureOpen(BufferedReader.java:97)
at java.io.BufferedReader.readLine(BufferedReader.java:292)