合理地将HttpUrlConnection无限期地打开到远程REST端点?

时间:2008-12-19 22:05:15

标签: java rest connection httpurlconnection

我希望优化一个持续运行的流程,并通过简单的REST样式HTTP帖子频繁调用(平均每秒1次)到外部API。我注意到的一件事是,目前,HttpUrlConnection是为每个API调用创建和关闭的,按照以下结构(为了便于阅读而删除了非基本代码和错误处理)。

//every API call
try {
  URL url = new URL("..remote_site..");
  conn = (HttpURLConnection) url.openConnection();
  setupConnectionOptions(conn); //sets things like timeoout and usecaches false
  outputWriter = new OutputStreamWriter(new BufferedOutputStream(conn.getOutputStream()));
  //send request
} finally {
  conn.disconnect();
  outputWriter.close();
}

我没有直接处理http协议的丰富经验,但基于常识/插槽知识,一般来说,只创建一次连接并重新使用它会更高效,只在问题上重新初始化它,以避免每次连接协商,如下所示:

//on startup, or error
private void initializeConnection()
{
  URL url = new URL("..remote_site..");
  conn = (HttpURLConnection) url.openConnection();
  setupConnectionOptions(conn); //sets things like timeoout and usecaches false
}

//per request
try {
  outputWriter = new OutputStreamWriter(new BufferedOutputStream(conn.getOutputStream()));
  //send request
} catch (IOException) {
  try conn.disconnect();
  initializeConnection();
} finally {
  outputWriter.close();
}

//on graceful exit
conn.disconnect();

我的问题是:

  • 这是一般的合理优化(速度增加是否会明显)?

假设是:

  • 我应该重用输出流以及连接吗?
  • 仅在错误时重新初始化连接是合理的,还是应该在一定数量的请求/时间后执行此操作?

1 个答案:

答案 0 :(得分:2)

基本上,是的,它节省了大量时间---设置套接字需要付出很大的努力,更糟糕的是使用SSL。这就是为什么“keepalive”在旧时代得以实施的原因。这与REST理念背道而驰,但它是性能优化。

关于它的一点是套接字是有限的资源;在一个非常繁重的环境中,最终可能没有用于新连接的套接字。这是一件坏事。