しばらくの間、私はマルチスレッド環境で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();
}
私たちは持っている予定です:
[方法A]
// global_c is initialized once through
// HttpClient global_c = new HttpClient(new MultiThreadedHttpConnectionManager());
try {
global_c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
通常の状況では、global_cは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()はパフォーマンスの問題を抱えていますか?
50 ++スレッドを使用するアプリケーションには、どちらの方法(AまたはB)が適しているかわかりますか?