使用电子表格API时无法完成HTTP请求



我正在开发一个谷歌应用程序引擎应用程序,它可以读取和编辑一个大约有150列500行的大电子表格。除了特定的大小(可能会有所不同),我正在寻找一种提高性能的方法,因为大多数时候我都会遇到500内部服务器错误(如下所示)。

java.lang.RuntimeException:无法完成HTTP请求导致通过:java.net.SocketTimeoutException:获取URL时超时:https://spreadsheets.google.com/feeds/worksheets/xxxxxxxxxxxxxxxxxxxxxxx/private/full

在下面的代码片段中,您可以看到我是如何阅读SpreadSheet的,以及哪一行引发异常。

for (SpreadsheetEntry entry : spreadsheets) {
if (entry.getTitle().getPlainText().compareTo(spreadsheetname) == 0) {
spreadsheet = entry;
}
}
WorksheetFeed worksheetFeed = service.getFeed(spreadsheet.getWorksheetFeedUrl(), WorksheetFeed.class);
List<WorksheetEntry> worksheets = worksheetFeed.getEntries();
WorksheetEntry worksheet = worksheets.get(0);
URL listFeedUrl = worksheet.getListFeedUrl();
// The following line is the one who generates the error
ListFeed listFeed = service.getFeed(listFeedUrl, ListFeed.class);
for (ListEntry row : listFeed.getEntries()) {
String content = row.getCustomElements().getValue("rowname");
String content2 = row.getCustomElements().getValue("rowname2");
}

我已经使用结构化查询改进了性能。基本上,我在URL中应用过滤器,这只允许我检索我需要的几行。请注意,不管怎样,我有时还是会出现上述错误。

URL listFeedUrl = new URI(worksheet.getListFeedUrl().toString() + "?sq=rowname=" + URLEncoder.encode(""" + filter+ """).toString()).toURL();

然而,我的问题不同,首先,在某些情况下,我必须读取所有行,但只能读取少数列(大约5行)。我仍然需要找到实现这一点的方法,我知道还有另一个参数"tq"允许选择列,但该语句需要字母表示法(如a、B、AA),我想使用列名。

最重要的是,我需要消除500内部服务器错误。由于这听起来像是超时问题,我想将该值增加到一个合理的时间量。我的用户可以等待几秒钟,因为这看起来完全是随机的。当它工作时,它会在大约2-3秒内加载页面。然而,当它不起作用时,我会收到一个500内部服务器错误,这对最终用户来说真的很令人沮丧。

知道吗?我在应用程序引擎设置中找不到任何内容。到目前为止,我唯一的想法是将电子表格拆分为多个电子表格(或工作表),以便阅读更少的列。然而,如果有一个选项可以让我增加超时时间,那就太棒了。

编辑:我在互联网上四处寻找,我可能找到了一些可以帮助我的东西。我刚刚发现服务对象提供了一个setConnectionTimeout方法,并立即对其进行了测试。

// Set timeout
int timeout = 60000;
service.setConnectTimeout(timeout);

超时

我使用10秒超时重试。它对我来说还可以。

图纸尺寸

我一次用了80000个细胞。它运行良好,我没有看到重试失败。我使用的是CellFeed,而不是ListFeed。

是的,它不喜欢大的薄片,1000个细胞左右的小薄片要快得多。即使我只写纸的一部分,小的纸也要快得多。(感觉它重新计算了整张表,因为看起来并没有减少到数据量,但我不确定)

指数后退

Zig建议指数退避——会对数字感兴趣——人们通过指数退避得到的超时值和失败率——以及纸张大小的影响。

我怀疑从3秒超时开始,每次重试都加倍可能会奏效,但还没有测试过

真正的问题是不应该使用电子表格。如果你试图大量使用它,它会抛出许多错误,包括速率限制。至少,您需要使用指数后退来重试错误,但速度仍然很慢。按url进行查询也不高效。解决方案是将spressheet转储到数据存储中,然后从那里进行查询。由于您还编辑电子表格,因此要使其与数据存储数据保持同步并不容易。通用解决方案要求任务队列正确处理超时和大量数据(单元格)

最新更新