我们必须读取一个平面文件并查询DB(SQL Server)中的相关行,该行返回的结果要大于所设置的块大小(2K)。因此我们无法在ItemProcessor中进行查询,因此将查询和更新部件移至ItemWriter。
在ItemWriter中,查询是使用JPA Repository方法完成的,该方法接受in clause
的一个字符串和2K值。
样本查询
select * from FOO where key=? and value in (?)
该表有5000万条记录。
提取行后,将进行一些修改并将其保留。退出方法时使用@Transactional
进行提交。对于“ FOO.key”(在50M记录中具有100K),所有这些都可以正常工作。但是对于“ FOO.KEY”(速度在50M或更高的情况下具有400K的速度)而言,速度较慢。两列都有索引。
这是怎么了?
答案 0 :(得分:0)
每个项目的块大小和返回结果的数量是两个不同的东西,将它们进行比较是没有意义的。
如果您正在读取块大小为100的平面文件,并且对每个项目都在查询数据库,并且该查询返回当前项目的2000条记录,那么比较2000和100是没有意义的。这两个数字之间没有关系。
因此我们无法在ItemProcessor中进行查询,因此将查询和更新部件移至ItemWriter。
这是怎么了?
在作家那里读书是错误的。项目编写器是要写入数据,在其中进行查询是不正确的。基本上,您正在实现driving query pattern,其中项目来自平面文件,而每个项目的补充数据都来自数据库。因此,您的查询应该进入项目处理器(而不是编写者),而更新部分应该进入项目编写器。