我试图对一些数据量进行excell导出。 5分钟后,在浏览器中我获得了504网关超时,在后端,该过程继续其工作。要完成整个服务,我需要大约15分钟。有什么办法可以防止这种情况发生吗?我无法访问生产中的服务器。
该应用程序是使用Oracle数据库进行Spring启动。我正在使用POI进行此导出。
答案 0 :(得分:2)
处理这类问题的一种常见方法是让第一个请求在后台启动进程,并在生成文件时从其他位置下载结果。第一个请求立即完成,然后用户可以检查另一个视图以查看该文件是否已生成,并下载结果。
答案 1 :(得分:1)
您可以将数据导出为较小的块。用10K记录运行测试,记下最后一条记录的id,并从下一条记录开始重复导出。如果10K快速完成,那么尝试50K。如果你有一个可能派上用场的计时器。祝你好运。
答案 2 :(得分:0)
在同样的情况下,网络呼叫的超时不在我们手中,所以我猜您有5分钟的时间接收第一个字节,然后超时消失了。
我的解决方案是,假设您有一个 controller 和一个 query 层来与数据库对话。在这种情况下,您可以通过异步方式进行处理。对该控制器的调用应仅触发该异步执行并立即返回成功状态,而无需等待。在这里执行将在后台发生。期货可以在这里使用,因为它们是异步的,一旦使用Future的回调方法,您还可以处理结果。
您可以在java8中使用Future和callback方法来实现,如下所示:
Futures.addCallback(
exportData,
new FutureCallback<String>() {
public void onSuccess(String message) {
System.out.println(message);
}
public void onFailure(Throwable thrown) {
thrown.getCause();
}
},
service)
并在Scala中像这样:
val result = Future {
exportData(data)
}
result.onComplete {
case Success(message) => println(s"Got the callback result:
$message")
case Failure(e) => e.printStackTrace
}