Некоторое время я использовал HttpClient в многопоточной среде. Для каждого потока, когда он инициирует соединение, он создаст совершенно новый экземпляр HttpClient.
Недавно я обнаружил, что с помощью этого подхода пользователь может открыть слишком много портов, и большинство подключений находятся в состоянии TIME_WAIT.
http://www.opensubscriber.com/message/[email protected]/86045.html
Следовательно, вместо каждого потока выполните:
HttpClient c = new HttpClient();
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
Мы планируем:
[МЕТОД А]
// global_c is initialized once through
// HttpClient global_c = new HttpClient(new MultiThreadedHttpConnectionManager());
try {
global_c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
В нормальной ситуации глобальный_c будет доступен одновременно потоками 50 ++. Мне было интересно, это создаст какие-либо проблемы с производительностью? Является ли MultiThreadedHttpConnectionManager использующим механизм блокировки для реализации политики безопасности потоков?
Если 10 потоков используют global_c, будут ли заблокированы остальные 40 потоков?
Или было бы лучше, если бы в каждом потоке я создавал экземпляр HttpClient, но явно освобождал диспетчер соединений?
[МЕТОД B]
MultiThreadedHttpConnectionManager connman = new MultiThreadedHttpConnectionManager();
HttpClient c = new HttpClient(connman);
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
connman.shutdown();
}
Будет ли connman.shutdown() страдать от проблем с производительностью?
Могу ли я узнать, какой метод (A или B) лучше, для приложения, использующего потоки 50 ++?