当前位置: 首页 > 知识库问答 >
问题:

Spring Batch:我们如何从DB预加载值,它将用于处理器部分

贺福
2023-03-14

我需要在ItemProcessor部分查找几个表。我不想对ItemProcessor部分中的每一行进行多个JDBC调用,当spring批处理开始处理更多记录时,这可能会导致性能问题。避免这种情况的变通方法是什么?有没有办法在ItemProcessor之前或批处理开始之前预加载这些对象,并在ItemProcessor中引用它们?

共有1个答案

许博达
2023-03-14

在Spring应用程序上下文初始化期间,您可以使用@PostCon结构注释您的方法来读取数据。让您的ItemReader的读取方法从列表中返回值。当整个列表完成时,返回null。这将停止读取。

@Service
public class YourItemReader implements ItemReader<DomainObject> {

 private int index;

 List<DomainObject> dbRows;

 @PostConstruct
 public void init() {
   List<DomainObject> //read from database
 }


@Override
public DomainObject read(){
        if (null != dbRows && index < dbRows.size()) {
         return dbRows.get(index);
       }
   return null;
}

如果记录的数量以百万计,我建议从数据库中执行基于块的读取,而不是一次读取所有记录,这可能会导致垃圾收集器内存不足异常。通过在表中添加一个名为STATUS的列来跟踪所处理记录的状态,可以很容易地做到这一点。最初,当您将数据加载到表中时,将状态设置为“未处理”,当ItemReader读取记录块时,将状态设置为“进行中”。ItemProcessor或ItemWriter完成处理后,将状态从“进行中”更改为“已处理”。确保将从数据库获取数据的方法设置为“已同步”。这将确保多个线程不会从数据库中获取相同的数据

public List<DomainObject> read(){
 return fetchDataFromDb();
}

private synchronized List<DomainObject> fetchProductAssociationData(){
//read your chunk-size of records from database which has status as 'NOT 
PROCESSED' 
 and change the status of the data which is read to 'IN PROGRESS'
return list;
}
 类似资料:
  • 我想用3个步骤建立一个批次。我想配置这个步骤,就像如果有100条记录,当step1读取、处理和写入一个10块时,step02,然后step03开始和结束,然后再次返回step1,读取下一个块。这在Spring批量可能吗?

  • 我正在使用AWS Sagemaker部署在Sagemaker之外培训的语音模型。我能够将我的模型转换为Sagemaker能够理解的东西,并将其部署为endpoint。问题是Sagemaker直接加载模型并调用。预测得到推论。我无法确定在部署的模型中可以在何处添加预处理函数。建议使用AWS Lambda或其他服务器进行预处理。有没有什么方法可以将复杂的预处理(不能通过简单的Scikit、类似熊猫的框

  • 我们的SpringBatch作业只有一个步骤,包括ItemReader、ItemProcessor和ItemWriter。我们用不同的参数同时运行同一个作业。ItemReader是有状态的,因为它包含从中读取的输入流。 因此,我们不希望ItemReader的相同实例用于每个JobInstance(作业参数)调用。 我不太确定哪种是这种情况的最佳“范围界定”。 1) 该步骤是否应该以@JobScop

  • 我有一个webview应用程序,可以从服务器加载资源(css、js、图像)。我希望它从应用程序的资产文件夹加载资源。我该怎么做?。 我尝试使用:

  • 在 webpack 中,所有的预处理器需要匹配对应的 loader。vue-loader 允许你使用其它 webpack loader 处理 Vue 组件的某一部分。它会根据 lang 属性自动推断出要使用的 loader。 CSS 例如,使用 Sass 编译我们的 <style> 语言块: npm install sass-loader node-sass --save-dev <style

  • 得益于 vue-loader, 我们可以通过 lang 属性在组件中的<template>, <script> 或 <style> 上使用各种预处理器。 举个例子,我们在 pages/index.vue 组件中使用 Pug, CoffeeScript 和 Sass: <template lang="pug"> h1.red Hello {{ name }}! </template> <scr