Seit einiger Zeit verwende ich HttpClient in einer Multithread-Umgebung. Wenn für jeden Thread eine Verbindung hergestellt wird, wird eine vollständig neue HttpClient-Instanz erstellt.
Kürzlich habe ich festgestellt, dass bei Verwendung dieses Ansatzes der Benutzer möglicherweise zu viele Ports geöffnet hat und sich die meisten Verbindungen im Status TIME_WAIT befinden.
http://www.opensubscriber.com/message/commons-httpclient-dev@jakarta.apache.org/86045.html
Daher, anstatt dass jeder Thread Folgendes tut:
HttpClient c = new HttpClient();
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
Wir planen:
[Methode A]
// global_c is initialized once through
// HttpClient global_c = new HttpClient(new MultiThreadedHttpConnectionManager());
try {
global_c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
In einer normalen Situation wird von 50 ++ Threads gleichzeitig auf global_c zugegriffen. Ich habe mich gefragt, ob dies zu Leistungsproblemen führt. Verwendet MultiThreadedHttpConnectionManager einen sperrfreien Mechanismus, um seine thread-sichere Richtlinie zu implementieren?
Wenn 10 Threads global_c verwenden, werden die anderen 40 Threads gesperrt?
Oder wäre es besser, wenn ich in jedem Thread eine Instanz eines HttpClient erstelle, aber den Verbindungsmanager explizit freigebe?
[Methode B]
MultiThreadedHttpConnectionManager connman = new MultiThreadedHttpConnectionManager();
HttpClient c = new HttpClient(connman);
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
connman.shutdown();
}
Wird connman.shutdown () Leistungsprobleme haben?
Darf ich wissen, welche Methode (A oder B) für die Anwendung mit 50 ++ Threads besser ist?