我正在尝试从网站获取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");
}
}
答案 0 :(得分:0)
我正在尝试从网站获取HTTP代码。当我无线程解析站点时,一切都很好。但是如果我使用线程,有时会收到
java.sql.SQLException: After end of result set
在
URL url = new URL(rset.getString("url"));
这与HTTP超时无关。您得到的例外是,因为您已经在读取所有结果(并且没有其他要读取的结果)之后尝试从数据库行中获取“ url”列。
您说这仅在使用多个线程时发生。好像线程进入了while循环(rset.next()
是真的)。然后另一个线程调用rset.next()
(移至结果集的末尾),结果为false,并且不进入循环。然后,第一个线程尝试获取URL,但是您已经超过了最后一个结果。
如果在多个线程之间共享ResultSet(或任何对象),则应该同步对ResultSet的访问,但是最好不要在线程之间共享ResultSet。更好的分割工作的方法是让一个线程从数据库中获取URL,然后由1个或多个线程进行HTTP连接(例如,线程池,每个URL有新线程等)。
答案 1 :(得分:0)
您需要将呼叫同步到ResultSet.next()
并事先检查是否已用尽。
现在您有两个线程同时调用它,第一个线程获取最后一行,而下一个在结果集已用尽时尝试获取一行。