ในขณะที่ฉันใช้ 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 () จะประสบปัญหาด้านประสิทธิภาพหรือไม่
ฉันขอทราบวิธีการ (A หรือ B) ที่ดีกว่าสำหรับแอปพลิเคชันที่ใช้เธรด 50 ++