我希望优化一个持续运行的流程,并通过简单的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();
我的问题是:
假设是:
答案 0 :(得分:2)
基本上,是的,它节省了大量时间---设置套接字需要付出很大的努力,更糟糕的是使用SSL。这就是为什么“keepalive”在旧时代得以实施的原因。这与REST理念背道而驰,但它是性能优化。
关于它的一点是套接字是有限的资源;在一个非常繁重的环境中,最终可能没有用于新连接的套接字。这是一件坏事。