한동안 나는 다중 스레드 환경에서 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)이 더 나은지 알 수 있습니까?