थोड़ी देर के लिए, मैं एक बहुस्तरीय वातावरण में 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();
}
हम योजना है:
[विधि ए]
// 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 धागे ग्लोबल_ सी का उपयोग कर रहे हैं, तो क्या अन्य 40 धागे लॉक हो जाएंगे?
या यह बेहतर होगा यदि, प्रत्येक थ्रेड में, मैं एक HttpClient का एक उदाहरण बनाता हूं, लेकिन कनेक्शन प्रबंधक को स्पष्ट रूप से जारी करें?
[विधि बी]
MultiThreadedHttpConnectionManager connman = new MultiThreadedHttpConnectionManager();
HttpClient c = new HttpClient(connman);
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
connman.shutdown();
}
क्या Conman.shutdown () प्रदर्शन समस्याओं से पीड़ित होगा?
क्या मुझे पता है कि 50 ++ थ्रेड का उपयोग करने के लिए कौन सी विधि (ए या बी) बेहतर है?