Per un po 'di tempo utilizzo HttpClient in un ambiente multithread. Per ogni thread, quando avvia una connessione, creerà un'istanza HttpClient completamente nuova.
Recentemente, ho scoperto che, utilizzando questo approccio, è possibile che l'utente abbia troppe porte aperte e la maggior parte delle connessioni sono nello stato TIME_WAIT.
http://www.opensubscriber.com/message/commons-httpclient-dev@jakarta.apache.org/86045.html
Quindi, invece di fare ogni thread:
HttpClient c = new HttpClient();
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
Prevediamo di avere:
[METODO A]
// global_c is initialized once through
// HttpClient global_c = new HttpClient(new MultiThreadedHttpConnectionManager());
try {
global_c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
In una situazione normale, si accederà a global_c da 50 ++ thread contemporaneamente. Mi chiedevo, questo creerà problemi di prestazioni? MultiThreadedHttpConnectionManager utilizza un meccanismo senza blocchi per implementare la sua politica thread-safe?
Se 10 thread utilizzano global_c, gli altri 40 thread verranno bloccati?
O sarebbe meglio se, in ogni thread, creo un'istanza di un HttpClient, ma rilasci esplicitamente il gestore connessione?
[METODO B]
MultiThreadedHttpConnectionManager connman = new MultiThreadedHttpConnectionManager();
HttpClient c = new HttpClient(connman);
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
connman.shutdown();
}
Connman.shutdown () subirà problemi di prestazioni?
Posso sapere quale metodo (A o B) è migliore, per l'applicazione che utilizza un 50 ++ thread?