我听到了我过去的回声,我想提供一种不同的方法,以防你重复我的错误。它可能适用于您的情况,也可能不适用于您的情况。
您写道,您需要从数据库中提取大量数据,然后持久化回数据库。
是否可以将您需要使用的任何外部数据临时插入到数据库中,并在数据库内执行所有处理?这将提供以下优点:
- 它消除了提取大量数据的需要
- 它消除了持久化大量数据的需要
- 它支持基于集合的处理(优于程序)
- 如果您的数据库支持它,您可以使用并行执行
- 它为您提供了一个框架(表和 SQL)来报告您在此过程中遇到的任何错误。
举个例子。很久以前,我实现了一个 (java) 程序,其目的是将购买、付款和相关的客户数据从文件加载到中央数据库中。那时(我深感遗憾),我设计了负载来处理事务,并为每条数据执行几次数据库查找(sql),最后将多次插入到适当的表中。自然,一旦数量增加,这不会扩展。
然后我又犯了一个错误。我认为问题出在数据库上(因为我听说SELECT 很慢),所以我决定从数据库中提取所有数据并用 Java 进行所有处理。然后最后将所有数据持久化回数据库。我用回调机制实现了各种层来轻松扩展加载过程,但我就是无法让它表现良好。
看着后视镜,我应该做的是在一个表中临时插入(可笑的少量)100,000 行,然后从那里处理它们。如果我充分发挥我掌握的所有技术的力量,需要将近半天的时间来处理最多只需要几分钟。