Я стремлюсь оптимизировать процесс, который выполняется постоянно и делает частые вызовы (в среднем> 1 в секунду) внешнему API через простую HTTP-запись в стиле REST. Одна вещь, которую я заметил, это то, что в настоящее время 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();
Мои вопросы:
- Является ли это разумной оптимизацией в целом (будет ли заметно увеличение скорости)?
Предположим, да:
- следует ли повторно использовать выходной поток, а также соединение?
- Разумно ли повторно инициализировать соединение при ошибке или я должен делать это после определенного количества запросов / времени?