我们正在使用大查询JAVA API来检索分析报告前端的结果。我们试图同步检索结果。很多时候,即使在参数中指定的查询超时之前,我们也会收到读取超时错误。这是示例失败的堆栈跟踪:
java.net.SocketTimeoutException: Read timed out
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at com.sun.net.ssl.internal.ssl.InputRecord.readFully(InputRecord.java:293)
at com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:331)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:830)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:787)
at com.sun.net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:75)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:218)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:258)
at java.io.BufferedInputStream.read(BufferedInputStream.java:317)
at sun.net.www.http.HttpClient.parseHTTPHeader(HttpClient.java:697)
at sun.net.www.http.HttpClient.parseHTTP(HttpClient.java:640)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1195)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:379)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.getResponseCode(HttpsURLConnectionImpl.java:318)
at com.google.api.client.http.javanet.NetHttpResponse.<init>(NetHttpResponse.java:36)
at com.google.api.client.http.javanet.NetHttpRequest.execute(NetHttpRequest.java:94)
at com.google.api.client.http.HttpRequest.execute(HttpRequest.java:965)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:410)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.executeUnparsed(AbstractGoogleClientRequest.java:343)
at com.google.api.client.googleapis.services.AbstractGoogleClientRequest.execute(AbstractGoogleClientRequest.java:460)
在检索 JobReference 对象之前,我无法检索生成的作业的作业ID,因为发生了错误。在这种情况下指定的超时是300秒。查询在它之前失败了。该查询包含三个JOIN和几个GROUP EACH BY子句。你能建议我们一种可能的调试方法吗?
添加代码段:
QueryRequest queryInfo = new QueryRequest().setQuery(sql)
.setTimeoutMs(timeOutInSec * 1000);
// get project id
BQGameConnectionDetails details = Config
.getBQConnectionDetails(gameId);
String projectId = details.getProjectId();
Bigquery.Jobs.Query queryRequest = getInstance(gameId).jobs()
.query(projectId, queryInfo);
QueryResponse response = queryRequest.execute();
答案 0 :(得分:1)
涉及两个超时。第一个超时是在您发送给bigquery的HTTP请求中。第二个是在bigquery请求超时。听起来你已经将后者设置为一个很大的值,但前者很可能是你击中的超时。如果HTTP请求在BigQuery超时之前超时,则连接将被关闭,BigQuery将无法响应。
有两种选择:首先是增加HTTP请求超时(这取决于您正在使用的库,但此页面here可能会有所帮助)。第二个是减少 bigquery超时。这意味着您必须使用jobs.getQueryResults()来读取实际结果,但这是一种更健壮的方法,因为查询所花费的时间并不重要,您只需调用getQueryResults()即可。一个循环。我会发布一个链接到一个很好的java样本,但不幸的是我不知道它存在。