Spring batch Spring批处理java.io.IOException:流关闭错误

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">

我有10个文本文件,其中包含要插入数据库的XML。每个文件大小约为113 MB。在读取了5-6个文件之后,我得到了“java.io.IOException:streamclosed”错误。下面是我的Spring批处理配置。你能建议我如何纠正这个问题吗

<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)