Depuis un certain temps, j'utilise HttpClient dans un environnement multithread. Pour chaque thread, lorsqu'il initie une connexion, il crée une toute nouvelle instance de HttpClient.
Récemment, j'ai découvert qu'en utilisant cette approche, l'utilisateur peut avoir trop de ports ouverts, et la plupart des connexions sont en état TIME_WAIT.
http://www.opensubscriber.com/message/commons-httpclient-dev@jakarta.apache.org/86045.html
Ainsi, au lieu que chaque thread fasse :
HttpClient c = new HttpClient();
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
Nous prévoyons d'avoir :
[MÉTHODE A]
// global_c is initialized once through
// HttpClient global_c = new HttpClient(new MultiThreadedHttpConnectionManager());
try {
global_c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
Dans une situation normale, global_c sera accédé par 50++ threads simultanément. Je me demandais si cela pouvait créer des problèmes de performance. MultiThreadedHttpConnectionManager utilise-t-il un mécanisme sans verrou pour mettre en œuvre sa politique de sécurité des threads ?
Si 10 fils utilisent global_c, les 40 autres fils seront-ils verrouillés ?
Ou serait-il préférable que, dans chaque fil, je crée une instance de HttpClient, mais que je libère explicitement le gestionnaire de connexion ?
[MÉTHODE B]
MultiThreadedHttpConnectionManager connman = new MultiThreadedHttpConnectionManager();
HttpClient c = new HttpClient(connman);
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
connman.shutdown();
}
Est-ce que connman.shutdown() aura des problèmes de performance ?
Puis-je savoir quelle méthode (A ou B) est la meilleure, pour une application utilisant un fil 50++ ?