Trong một thời gian, tôi đã sử dụng HttpClient trong môi trường đa luồng. Đối với mỗi luồng, khi nó khởi tạo một kết nối, nó sẽ tạo một phiên bản HttpClient hoàn toàn mới.
Gần đây, tôi đã phát hiện ra rằng, bằng cách sử dụng cách tiếp cận này, nó có thể khiến người dùng mở quá nhiều cổng và hầu hết các kết nối đều ở trạng thái TIME_WAIT.
http://www.opensubscriber.com/message/commons-httpclient-dev@jakarta.apache.org/86045.html
Do đó, thay vì mỗi chuỗi làm:
HttpClient c = new HttpClient();
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
Chúng tôi dự định có:
[PHƯƠNG PHÁP A]
// global_c is initialized once through
// HttpClient global_c = new HttpClient(new MultiThreadedHttpConnectionManager());
try {
global_c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
Trong tình huống bình thường, global_c sẽ được truy cập đồng thời bởi 50 ++ luồng. Tôi đã tự hỏi, liệu điều này có tạo ra bất kỳ vấn đề hiệu suất nào không? MultiThreadedHttpConnectionManager có đang sử dụng cơ chế không có khóa để thực hiện chính sách an toàn luồng của nó không?
Nếu 10 chủ đề đang sử dụng global_c thì 40 chủ đề còn lại có bị khóa không?
Hoặc sẽ tốt hơn nếu, trong mỗi luồng, tôi tạo một phiên bản của HttpClient, nhưng giải phóng trình quản lý kết nối một cách rõ ràng?
[PHƯƠNG PHÁP B]
MultiThreadedHttpConnectionManager connman = new MultiThreadedHttpConnectionManager();
HttpClient c = new HttpClient(connman);
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
connman.shutdown();
}
Connman.shutdown () có gặp sự cố về hiệu suất không?
Tôi có thể biết phương pháp nào (A hoặc B) tốt hơn cho ứng dụng sử dụng luồng 50 ++ không?