Деякий час я використовую HttpClient у багатопотоковому середовищі. Для кожного потоку, коли він ініціює підключення, він створює абсолютно новий екземпляр HttpClient.
Нещодавно я виявив, що, використовуючи цей підхід, це може призвести до того, що у користувача буде відкрито занадто багато портів, і більшість з'єднань перебувають у стані TIME_WAIT.
http://www.opensubscriber.com/message/commons-httpclient-dev@jakarta.apache.org/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();
}
У звичайній ситуації глобальний_с буде доступний одночасно за допомогою 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 ++?