正确更新 http 超时
Update http timeouts properly
我正在尝试从网站获取 HTTP 代码。
当我一个一个地解析没有线程的站点时,一切都很好。
但是如果我使用线程,有时我会收到
java.sql.SQLException: After end of result set
在
URL url = new URL(rset.getString("url"));
我认为问题出在超时上,如果超时 > 那么我想打破循环。
if (connection.getConnectTimeout()>10)
{
System.out.println("timeout");
break;
}
但是好像永远都行不通。我究竟做错了什么?谢谢你。问题代码的完整部分如下。
static class JThread extends Thread {
JThread(String name){
super(name);
}
public void run() {
try {
while (rset.next()) {
System.out.println("hello");
URL url = new URL(rset.getString("url"));
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.connect();
if (connection.getConnectTimeout()>10)
{
System.out.println("timeout");
break;
}
//Thread.sleep(1000);
int code = connection.getResponseCode();
System.out.println(code);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Thread stopped");
}
}
I am trying to get HTTP codes from websites. When I parse sites without threads, one-by-one, everything is fine. But if I use threads, sometimes I receive
java.sql.SQLException: After end of result set
at
URL url = new URL(rset.getString("url"));
这与 HTTP 超时无关。您得到的异常是因为您在已经阅读了所有结果(并且没有更多结果可读)之后试图从数据库行中获取 "url" 列。
你说这只发生在你使用多线程的时候。看起来线程进入了 while 循环(rset.next()
为真)。然后另一个线程调用 rset.next()
(移动到结果集的末尾),得到 false,并且不进入循环。然后第一个线程尝试获取 URL,但您已经超过了最后一个结果。
如果 ResultSet(或任何对象)在多个线程之间共享,您应该同步对它的访问,但最好不要在线程之间共享 ResultSet。一种更好的拆分工作的方法是让一个线程从数据库中获取 URLs,并且 1 个或多个线程进行 HTTP 连接(例如线程池,每个 URL 的新线程等.).
你需要同步对ResultSet.next()
的调用,并事先检查是否已用完。
现在有两个线程同时调用它,第一个获取最后一行,下一个尝试在结果集已经耗尽时获取一行。
我正在尝试从网站获取 HTTP 代码。 当我一个一个地解析没有线程的站点时,一切都很好。 但是如果我使用线程,有时我会收到
java.sql.SQLException: After end of result set
在
URL url = new URL(rset.getString("url"));
我认为问题出在超时上,如果超时 > 那么我想打破循环。
if (connection.getConnectTimeout()>10)
{
System.out.println("timeout");
break;
}
但是好像永远都行不通。我究竟做错了什么?谢谢你。问题代码的完整部分如下。
static class JThread extends Thread {
JThread(String name){
super(name);
}
public void run() {
try {
while (rset.next()) {
System.out.println("hello");
URL url = new URL(rset.getString("url"));
HttpURLConnection connection = (HttpURLConnection) url.openConnection();
connection.setRequestMethod("GET");
connection.connect();
if (connection.getConnectTimeout()>10)
{
System.out.println("timeout");
break;
}
//Thread.sleep(1000);
int code = connection.getResponseCode();
System.out.println(code);
}
} catch (SQLException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (ProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
System.out.println("Thread stopped");
}
}
I am trying to get HTTP codes from websites. When I parse sites without threads, one-by-one, everything is fine. But if I use threads, sometimes I receive
java.sql.SQLException: After end of result set
at
URL url = new URL(rset.getString("url"));
这与 HTTP 超时无关。您得到的异常是因为您在已经阅读了所有结果(并且没有更多结果可读)之后试图从数据库行中获取 "url" 列。
你说这只发生在你使用多线程的时候。看起来线程进入了 while 循环(rset.next()
为真)。然后另一个线程调用 rset.next()
(移动到结果集的末尾),得到 false,并且不进入循环。然后第一个线程尝试获取 URL,但您已经超过了最后一个结果。
如果 ResultSet(或任何对象)在多个线程之间共享,您应该同步对它的访问,但最好不要在线程之间共享 ResultSet。一种更好的拆分工作的方法是让一个线程从数据库中获取 URLs,并且 1 个或多个线程进行 HTTP 连接(例如线程池,每个 URL 的新线程等.).
你需要同步对ResultSet.next()
的调用,并事先检查是否已用完。
现在有两个线程同时调用它,第一个获取最后一行,下一个尝试在结果集已经耗尽时获取一行。