spring-batch - 从文件中读取并从 DB 中查询结果超过块大小和更新的相关行
问题描述
我们必须读取一个平面文件并查询 DB(SQL 服务器)中的相关行,它返回的结果超过了正在设置的块大小(2K)。所以我们无法在 ItemProcessor 中查询,所以将查询和更新部分移至 ItemWriter。
在 ItemWriter 中,查询是使用 JPA Repository 方法完成的,该方法接受一个字符串和 2K 个in clause
.
样本查询,
select * from FOO where key=? and value in (?)
该表有 50M 条记录。获取行后将进行一些修改并保留它。退出方法时使用@Transactional
to 提交。对于在 50M 记录中具有 100K 的“FOO.key”,所有这些都可以正常工作。但是对于“FOO.KEY”来说速度很慢,它在 50M 和更多中具有 400K。两列都有索引。
这里有什么问题?
解决方案
每个项目的块大小和返回结果的数量是两个不同的东西,比较它们是没有意义的。
如果您正在读取块大小为 100 的平面文件,并且对于每个项目,您正在对数据库进行查询,并且此查询返回当前项目的 2000 条记录,那么比较 2000 和 100 是没有意义的。这两个数字之间没有关系。
所以我们无法在 ItemProcessor 中查询,所以将查询和更新部分移至 ItemWriter。
这里有什么问题?
在这里阅读作者是错误的。项目编写器旨在写入数据,在其中进行查询是不正确的。您基本上是在实现驱动查询模式,其中项目来自平面文件,每个项目的补充数据来自数据库。因此,您的查询应该进入项目处理器(而不是编写器)和项目编写器中的更新部分。
推荐阅读
- python - 列表中的元组的项目少于函数需要 Python 3
- html - 页面内容重叠导航栏
- azure - 从 Azure 表存储到 Cosmos DB 表存储的数据迁移,
- windows - “混帐添加。” 不工作
- c# - Fluent API - 在一个实体中配置同一类的多个实例
- python - HDF5 转数据帧格式
- python - 使用单个管道预处理具有不同特征类型的数据集
- uwp - [UWP][C#] 我的应用程序不健康
- eclipse - STM32 GNU ARM 链接器:使用 eclipse 对函数()的未定义引用
- javascript - getCredentialsForIdentity - ResourceNotFoundException