我希望通过一个简单的 REST 风格的 HTTP 帖子优化一个持续运行并频繁调用(平均每秒 > 1 次)外部 API 的进程。我注意到的一件事是,目前,根据以下结构,为每个 API 调用创建和关闭 HttpUrlConnection(为了便于阅读,删除了非必要代码和错误处理)。
//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();
我的问题是:
- 一般来说,这是一个合理的优化吗(速度增加会很明显)吗?
假设是:
- 我应该重用输出流以及连接吗?
- 仅在错误时重新初始化连接是否合理,或者我应该在一定数量的请求/时间后这样做?