Java SpringBatch itemReader使用了大量内存
我从一个数据库中读取,它有很多行,是的,但是“我想读卡器在这个步骤中会释放内存”。它需要超过1Gb的内存。如何改进它?使用另一种阅读器Java SpringBatch itemReader使用了大量内存,java,spring,spring-batch,Java,Spring,Spring Batch,我从一个数据库中读取,它有很多行,是的,但是“我想读卡器在这个步骤中会释放内存”。它需要超过1Gb的内存。如何改进它?使用另一种阅读器 ... <bean id="database1" class="org.springframework.batch.item.database.JdbcCursorItemReader"> <property name="name" value="bd1" /> <property name="dataSource"
...
<bean id="database1" class="org.springframework.batch.item.database.JdbcCursorItemReader">
<property name="name" value="bd1" />
<property name="dataSource" ref="dataSource1" />
<property name="sql" value="select image from info where image like '%/Images/%' or image like '%/temp/%'" />
<property name="rowMapper">
<bean class="foo.ImagesRowMapper" />
</property>
</bean>
<batch:step id="1Step" next="2Step">
<batch:tasklet>
<batch:chunk reader="database1" processor="processor" writer="writer" commit-interval="20"/>
</batch:tasklet>
</batch:step>
...
作者“不做任何事情”被评论
您可以利用spring批处理并行处理: 您可以定义taskExecutor
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="5" />
<property name="maxPoolSize" value="5" />
在tasklet中使用此taskexecutor
<batch:tasklet ref="whatever_your_tasklet_name" transaction-manager="transactionManager" task-executor="taskExecutor" />
Spring文档:这很奇怪;我们尝试了很多行,但没有问题。可能是数据库驱动程序的问题?我正在使用
com.mysql.jdbc.driver
如果内存没有释放,那么对象上会有一些东西。你能发布一些代码吗(RowMapper
,ItemProcessor
和ItemWriter
)。当然,这也可能是JDBC驱动程序的问题(正如@bellabax所提到的),您可以尝试调整fetch大小等。如何确定这是否是JDBC问题?它与其他东西配合得很好。这可能是每个项目的大小,提交间隔小得多可以吗?这是一个复制过去的错误。请忽略我想展示的是如何使用“task executor”属性引用task executor
<bean id="taskExecutor" class="org.springframework.scheduling.concurrent.ThreadPoolTaskExecutor">
<property name="corePoolSize" value="5" />
<property name="maxPoolSize" value="5" />
<batch:tasklet ref="whatever_your_tasklet_name" transaction-manager="transactionManager" task-executor="taskExecutor" />