Spring Batch:聚合记录和写入计数

2023-12-20

我们有一些数据来自平面文件。例如

EmpCode,Salary,EmpName,...  
100,1000,...,...
200,2000,...,...
200,2000,...,...
100,1000,...,...
300,3000,...,...
400,4000,...,...

我们想根据 EmpCode 聚合工资并写入数据库:

Emp_Code    Emp_Salary   Updated_Time   Updated_User 
100         2000         ...            ...
200         4000         ...            ...
300         3000         ...            ...
400         4000         ...            ...

我按照 Spring Batch 编写了类,如下所示

ItemReader - to read the employee data into a Employee object                

示例 Employee ItemProcessor:

public class EmployeeProcessor implements ItemProcessor<Employee, Employee> {

    @Override
    public Employee process(Employee employee) throws Exception {
        employee.setUpdatedTime(new Date());
        employee.setUpdatedUser("someuser");
        return employee;
    }

员工项目作者:

@Repository
public class EmployeeItemWriter implements ItemWriter<Employee> { 
 @Autowired
 private SessionFactory sf;

 @Override  
 public void write(List<? extends Employee> employeeList) throws Exception {  
  List<Employee> aggEmployeeList = aggregateEmpData(employeeList);
  //write to db using session factory
 }  

 private List<Employee> aggregateEmpData(List<? extends Employee> employeeList){
     Map<String, Employee> map = new HashMap<String, Employee>(); 
    for(Employee e: employeeList){
        String empCode =  e.getEmpCode();
        if(map.containsKey(empCode)){
            //get employee salary and add up
         }else{
          map.put(empCode,Employee);
         }
     }    
     return new ArrayList<Employee>(map.values());         
 }
}

XML配置

...
<batch:job id="employeeJob">
    <batch:step id="step1">
    <batch:tasklet>
        <batch:chunk reader="employeeItemReader" 
            writer="employeeItemWriter" processor="employeeItemProcessor"
            commit-interval="100">
        </batch:chunk>
    </batch:tasklet>
    </batch:step>
  </batch:job>
...

它正在发挥作用并服务于我的目的。不过,我有几个问题。

1)当我查看日志时,显示如下(commit-interval=100):

状态=已完成,exitStatus=已完成,readCount=2652,filterCount=0,写入次数=2652readSkipCount=0、writeSkipCount=0、processSkipCount=0、commitCount=27、rollbackCount=0

但聚合后,只有 2515 条记录写入数据库。写入次数为2652。是否是因为到达ItemWriter的项目数仍然是2652?如何纠正这个问题?

2)我们对列表进行两次迭代。一次在 ItemProcessor 中,然后在 ItemWriter 中进行聚合。如果记录数量较多,则可能会出现性能问题。有没有更好的方法来实现这一目标?


如果输入文件的每一行都是一个员工对象,那么你的读取计数将是输入文件中的行数。写入次数将是传递给项目编写器的所有列表的大小总和。所以,也许你的聚合员工数据函数删除或聚合一些记录到一条记录中,因此,您的数据库计数与写入次数。 如果你想确保写入次数正是数据库中的记录数,您应该在处理器中进行聚合。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Spring Batch:聚合记录和写入计数 的相关文章

随机推荐

  • 为什么我不能在抽象 C# 类上创建抽象构造函数?

    我正在创建一个抽象类 我希望我的每个派生类都被迫实现构造函数的特定签名 因此 如果我想强迫他们实现一种方法 我做了我会做的事情 我做了一个抽象的方法 public abstract class A abstract A int a int
  • Typescript 中带有 Observable 的 XMLHttpRequest

    当我尝试管理上传文件的 XMLHttpRequest 调用的结果时 我遇到了 tslint 问题 这是我目前在互联网上找到的方法 Files upload request makeFileRequest url string files A
  • 如何使用 CURLOPT_HEADERFUNCTION 读取单个响应标头字段?

    我正在实现一个 C 程序 它需要从读取远程文件的大小Content Length标题 当Content Length在响应标头中发送 我查看了 libcurl 的文档 到目前为止我能想到的最好的方法是回调函数CURLOPT HEADERFU
  • 在 Access VBA 中实施正则表达式以提高密码复杂性

    我目前正在开发一个需要密码验证的项目 因为最终用户可以更改其登录密码 但没有验证来确保给定的密码符合规定 这有点棘手 因为我对使用 VBA 和正则表达式相当陌生 而且我找不到我正在寻找的答案 该项目有一个 Access 2010 前端 虽然
  • 如何在 MySQL 中强制复合唯一性?

    我遇到了一种情况 我想确保表的复合元素是唯一的 例如 Table id char 36 primary key fieldA varChar 12 not null fieldB varChar 36 not null 我不希望 field
  • CentOS安装mod_dav_svn

    我正在尝试在 centos 5 VPS 上安装 subversion 我设法安装了 subversion 但是当我尝试这样做时yum install mod dav svn我收到此错误 错误 缺少依赖项 httpd mmn 包裹需要2005
  • 如何从 zlib 确定 gzip 数据的压缩大小?

    我正在使用 zlib 执行 gzip 压缩 zlib 将数据压缩后直接写入打开的 TCP 套接字 socket fd is a file descriptor for an open TCP socket gzFile gzf gzdope
  • Rust 中精确的内存布局控制?

    据我所知 Rust 编译器可以对结构的每个字段进行打包 重新排序和添加填充 如果需要的话 如何指定精确的内存布局 在 C 中 我有StructLayout属性 并且在 C C 中 我可以使用各种编译器扩展 我可以通过检查预期值位置的字节偏移
  • Android NDK 包括使用 Gradle 和 CMake 的第 3 方预构建共享库

    我正在努力将预构建的共享库包含在我的 android 项目中 有问题的库是 libusb 我的 android 项目的 NDK 部分需要它 一切都编译和链接正常 即项目正在成功构建 但是在我的设备上安装 apk 时 应用程序崩溃了 来自监视
  • 如果端口已使用,spring-boot 自动更改端口

    我正在使用 Windows 命令来运行带有 embedded tomcat 的 spring boot 应用程序 此外 我需要使用 CommandlineRunner 运行许多控制台应用程序 我正面临端口使用问题 APPLICATION F
  • FlowType:类型的继承(类型A是类型B的子集...)

    自发布以来流动 42 https github com facebook flow releases tag v0 42 0 你可以 使用对象类型传播 type TypeB TypeA 我想这确实是关于 FlowType 的初学者类型的问题
  • 在没有 XML 的情况下配置 JPA/Hibernate/PostgreSQL

    我又回到了 Java 世界 并尝试使用 JPA Hibernate 和 PostgreSQL 配置一个新的 Spring Web 应用程序 我发现了很多带有各种 XML 配置文件的旧示例 我想知道是否有一种首选的新方法可以在不依赖 XML
  • 如何使用js自动下载PDF?

    我的场景是 PDF 文件自动下载 然后用户填写它 当单击 PDF 中的提交按钮时 它会连接到 java servlet 并将其保存在数据库中 用户点击按钮 JavaScript 代码自动运行并下载 PDF 文件 自动使用 JavaScrip
  • 覆盖 Swagger 排序

    我想按相反的字母顺序组织我的 swagger api 但它默认为按字母顺序 有没有一种简单的方法可以做到这一点 具体使用 Swashbuckle Core 5 2 1 您可以为这两个操作的 UI 创建一个排序器 operationsSort
  • ASP.NET Web API 操作方法参数的依赖注入

    我正在使用 C 开发一个 ASP NET Web API 项目 用于移动应用程序的 JSON 接口 我的想法是为所有请求创建接口 然后仅在 Web API 代码中使用这些接口 我最终得到了这样的结果 public interface IAp
  • 如何允许在 Delphi 中拖动特定控件的文件

    我想在有人将文件放到特定控件 例如 TMemo 时立即接受文件 我从这个例子开始 http delphi about com od windowsshellapi a accept filedrop htm http delphi abou
  • 在C#中添加记录时如何处理数据表中的唯一约束异常

    我已经像这样向数据表添加了唯一约束 DataTable dtemp private void TempTable dtemp new DataTable Temp dtemp Columns Add new DataColumn Table
  • 如何在 Python 中验证 RSA SHA1 签名?

    我有一个字符串 一个签名和一个公钥 我想验证字符串上的签名 关键看起来像这样 BEGIN PUBLIC KEY MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDfG4IuFO2h LdDNmonwGNw5srW
  • 为什么要发送没有负载的 UDP 数据包?

    看来 UDP 数据包可以在没有负载的情况下发送 我能想到的唯一不需要负载的就是 NAT 打洞 这还能用来做什么 这与我之前的问题有关在 Linux 下 recv 能否在 UDP 上返回 0 https stackoverflow com q
  • Spring Batch:聚合记录和写入计数

    我们有一些数据来自平面文件 例如 EmpCode Salary EmpName 100 1000 200 2000 200 2000 100 1000 300 3000 400 4000 我们想根据 EmpCode 聚合工资并写入数据库 E