有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java Spring批处理多线程作业失败,原因是“致命:由于idleintransaction超时而终止连接”

我们正在努力提高spring批处理作业的性能,由于不熟悉这项技术,我们遇到了一个问题

我们有一个spring批处理作业,它读取一个包含大约2,5 mil记录的表,并为每个记录更新几个其他表。作业计划每天连续运行多次。在引入多线程概念后,作业的3-4个实例运行得非常快,没有问题,然后作业就停止执行,批处理作业执行表中的状态启动,没有改变,但没有读/写。我发现的唯一日志显示“致命:由于事务超时中的空闲而终止连接”。我们使用的线程数是3,块大小是100。感谢您的帮助

事务中的空闲超时是1d,我们在AWS上使用Postgres


共 (1) 个答案

  1. # 1 楼答案

    在这种情况下,您可以尝试使用事件驱动。因为你正在从数据库中获取大量记录并更新多个表,所以你的应用程序可能会内存不足并失败。将操作拆分为多个lambda,然后在多个lambda中执行选择和更新操作。还要注意数据库可以处理的最大连接数。我猜你在2.5 mil记录集上运行循环,这可能是你问题的根本原因。虽然它是异步的,但它保存对象并消耗大量内存。一个提交是锁定表,另一个是阻塞其他线程。重构你的代码,并在阅读完1条记录后将其放入SNS或队列中。其他lambda将接收它并执行其余的处理。如果您使用的是Aurora,那么就创建多个writer实例