Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Spring批处理事务/连接和提交块级别的边界管理_Spring_Spring Batch_Spring Transactions - Fatal编程技术网

Spring批处理事务/连接和提交块级别的边界管理

Spring批处理事务/连接和提交块级别的边界管理,spring,spring-batch,spring-transactions,Spring,Spring Batch,Spring Transactions,由于与现有应用程序集成的局限性,我们需要为每个区块使用单独的数据库连接,并在区块的末尾管理一个commit边界。 我们设计使用远程分区并在workers上处理多个分区。分区步骤应按顺序执行块 我们尝试了一种将Chink Listener和processor相结合的方法,将在前chunk Listener方法中获得的连接作为实例变量,并在处理时使用它 但是这个连接在beforeChunk方法处理的第一个项之后被替换。在这种情况下使用了无资源事务管理器。无论如何,不建议将此事务管理器用于生产。 我们

由于与现有应用程序集成的局限性,我们需要为每个区块使用单独的数据库连接,并在区块的末尾管理一个commit边界。 我们设计使用远程分区并在workers上处理多个分区。分区步骤应按顺序执行块

我们尝试了一种将Chink Listener和processor相结合的方法,将在前chunk Listener方法中获得的连接作为实例变量,并在处理时使用它

但是这个连接在beforeChunk方法处理的第一个项之后被替换。在这种情况下使用了无资源事务管理器。无论如何,不建议将此事务管理器用于生产。 我们被期望并行处理块,而不是这样。 我们还观察到,当调用write方法时,当我们在writer处保持连接时,beforeChunk方法正在关闭

第二种方法是使用DataSourceTransactionManager,但不确定如何从区块级别使用的事务获取连接

步骤配置如下:-

<step id="senExtractGeneratePrintRequestWorkerStep" xmlns=http://www.springframework.org/schema/batch>
                                <tasklet>
                                                <chunk reader="senExtractGeneratePrintRequestWorkerItemReader"
                                                                processor="senExtractGeneratePrintRequestWorkerItemProcessor"
                                                                writer="senExtractGeneratePrintRequestWorkerMultiItemWriter"
                                                                commit-interval="${senExtractGeneratePrintRequestWorkerStep.commit-interval}" 
                                                                skip-limit="${senExtractGeneratePrintRequestWorkerStep.skip-limit}">
                                                                <skippable-exception-classes>
                                                                                <batch:include class="java.lang.Exception" />
                                                                </skippable-exception-classes>
                                                </chunk>
                                                <listeners>
                                                                <listener ref="senExtractGeneratePrintRequestWorkerItemProcessor" />
                                                </listeners>
                                </tasklet>
</step>
<bean id="senExtractGeneratePrintRequestWorkerItemProcessor"
        scope="step"
        class="com.abc.batch.senextract.worker.SENExtractGeneratePrintRequestItemProcessor"/>
    

在调用write之前,数据源关闭了连接。呼叫层次结构的屏幕截图如下。

我想帮你,但我不清楚你的问题和要求。为什么每个区块都需要数据库连接?这意味着如果您有10.000个区块,单个作业将打开/关闭10.000个连接。这真的是你想要的吗?我看不到有效的用例,但是如果您真的需要这样做,您需要一个自定义的步骤实现,因为SpringBatch中默认提供的面向块的Tasklet实现使用单个数据库连接。我很好奇您设计的数据处理工作是什么样的,有这样的要求。Hi@MahmoudBenHassine谢谢您的回复,我们这里的使用案例是,我们使用的是传统的处理应用程序,它需要数据库连接和auto commit FALSE作为主属性传递,应用程序代码在内部使用自己的方式管理业务场景。读写在Spring批处理之外单独管理,我们称之为。因此,我们正在尝试检查每个步骤使用相同DB连接的方法,并在块级别提交。我们只是通过创建我们可以在步骤级别建立连接来解决这个问题,通过在beforeStep创建具有DB连接的自定义对象并通过参数注入在处理器中使用相同的对象来解决这个问题。在侦听器中执行afterChunk中的提交和afterStep方法,以不保留太多提交/最小化故障回滚到块级别。请分享您对这种方法的看法。