首页 > 解决方案 > 从文件中读取并从 DB 中查询结果超过块大小和更新的相关行

问题描述

我们必须读取一个平面文件并查询 DB(SQL 服务器)中的相关行,它返回的结果超过了正在设置的块大小(2K)。所以我们无法在 ItemProcessor 中查询,所以将查询和更新部分移至 ItemWriter。

在 ItemWriter 中,查询是使用 JPA Repository 方法完成的,该方法接受一个字符串和 2K 个in clause.

样本查询,

select * from FOO where key=? and value in (?)

该表有 50M 条记录。获取行后将进行一些修改并保留它。退出方法时使用@Transactionalto 提交。对于在 50M 记录中具有 100K 的“FOO.key”,所有这些都可以正常工作。但是对于“FOO.KEY”来说速度很慢,它在 50M 和更多中具有 400K。两列都有索引。

这里有什么问题?

标签: spring-batch

解决方案


每个项目的块大小和返回结果的数量是两个不同的东西,比较它们是没有意义的。

如果您正在读取块大小为 100 的平面文件,并且对于每个项目,您正在对数据库进行查询,并且此查询返回当前项目的 2000 条记录,那么比较 2000 和 100 是没有意义的。这两个数字之间没有关系。

所以我们无法在 ItemProcessor 中查询,所以将查询和更新部分移至 ItemWriter。

这里有什么问题?

在这里阅读作者是错误的。项目编写器旨在写入数据,在其中进行查询是不正确的。您基本上是在实现驱动查询模式,其中项目来自平面文件,每个项目的补充数据来自数据库。因此,您的查询应该进入项目处理器(而不是编写器)和项目编写器中的更新部分。


推荐阅读