我们正在努力提高春季批处理作业的性能,而对于这项技术,我们遇到了一个问题。
我们有一个春季批处理作业,它读取一个包含大约2500万条记录的表,并对每条记录更新其他几个表。该作业计划每天连续多次运行。在引入多线程概念之后,作业的3-4实例运行得非常快,没有问题,然后作业就停止执行,BATCH_JOB_EXECUTION_TABLE中的状态就会启动,不会改变,但不会发生读/写。我发现的唯一日志记录是“致命的:由于空闲事务内超时而终止连接”。我们使用的线程数为3,块大小为100。任何帮助都是非常感谢的。
idle_in_transaction_timeout是1d,我们在AWS上使用Postgres
发布于 2021-07-21 12:04:37
您可以在此场景中尝试事件驱动。由于您正在从DB中获取这么多记录并更新多个表,所以您的应用程序可能会出现内存不足和失败的情况。在多个lambda中拆分操作,然后在多个lambda中执行select和update操作。还要注意您的数据库可以处理多少最大连接。我想您正在2.5百万记录集上运行一个循环,这可能是问题的根本原因。即使很难,它也是异步的,但是它保存着对象,消耗了大量的内存。一个提交是锁定表,它阻塞其他线程。重构您的代码,并在读取1条记录后,将其放入SNS或队列中。其他lambda将捡起它并执行其余的处理。如果您正在使用Aurora,那么创建多个编写实例。
https://stackoverflow.com/questions/68468502
复制相似问题