正确更新 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()的调用,并事先检查是否已用完。

现在有两个线程同时调用它,第一个获取最后一行,下一个尝试在结果集已经耗尽时获取一行。