Od jakiegoś czasu używam HttpClient w środowisku wielowątkowym. Dla każdego wątku, kiedy inicjuje połączenie, utworzy zupełnie nowe wystąpienie HttpClient.
Niedawno odkryłem, że stosując to podejście, może to spowodować, że użytkownik otworzy zbyt wiele portów, a większość połączeń jest w stanie TIME_WAIT.
http://www.opensubscriber.com/message/commons-httpclient-dev@jakarta.apache.org/86045.html
Dlatego zamiast robić każdy wątek:
HttpClient c = new HttpClient();
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
Planujemy mieć:
[METODA A]
// global_c is initialized once through
// HttpClient global_c = new HttpClient(new MultiThreadedHttpConnectionManager());
try {
global_c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
W normalnej sytuacji do global_c będzie miało dostęp 50 ++ wątków jednocześnie. Zastanawiałem się, czy spowoduje to jakiekolwiek problemy z wydajnością? Czy MultiThreadedHttpConnectionManager używa mechanizmu bez blokady do implementacji zasad bezpieczeństwa wątków?
Jeśli 10 wątków używa global_c, czy pozostałe 40 wątków zostanie zablokowanych?
A może byłoby lepiej, jeśli w każdym wątku utworzę wystąpienie HttpClient, ale jawnie zwolnię menedżera połączeń?
[METODA B]
MultiThreadedHttpConnectionManager connman = new MultiThreadedHttpConnectionManager();
HttpClient c = new HttpClient(connman);
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
connman.shutdown();
}
Czy w przypadku connman.shutdown () występują problemy z wydajnością?
Czy mogę wiedzieć, która metoda (A lub B) jest lepsza dla aplikacji korzystającej z wątków 50 ++?