Bir süredir, çok iş parçacıklı bir ortamda HttpClient kullanıyorum. Her iş parçacığı için bir bağlantı başlattığında tamamen yeni bir HttpClient örneği oluşturacaktır.
Son zamanlarda, bu yaklaşımı kullanarak, kullanıcının çok fazla bağlantı noktasına sahip olmasına ve bağlantıların çoğunun TIME_WAIT durumunda olmasına neden olabileceğini keşfettim.
http://www.opensubscriber.com/message/commons-httpclient-dev@jakarta.apache.org/86045.html
Dolayısıyla, her iş parçacığı yerine:
HttpClient c = new HttpClient();
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
Sahip olmayı planlıyoruz:
[YÖNTEM A]
// global_c is initialized once through
// HttpClient global_c = new HttpClient(new MultiThreadedHttpConnectionManager());
try {
global_c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
}
Normal bir durumda, global_c'ye 50 ++ evre ile eşzamanlı olarak erişilecektir. Merak ediyordum, bu herhangi bir performans sorunu yaratır mı? MultiThreadedHttpConnectionManager, iş parçacığı güvenli ilkesini uygulamak için kilitsiz bir mekanizma kullanıyor mu?
10 iş parçacığı global_c kullanıyorsa, diğer 40 iş parçacığı kilitlenecek mi?
Ya da her iş parçacığında bir HttpClient örneği oluşturup bağlantı yöneticisini açık bir şekilde serbest bırakırsam daha iyi olur mu?
[YÖNTEM B]
MultiThreadedHttpConnectionManager connman = new MultiThreadedHttpConnectionManager();
HttpClient c = new HttpClient(connman);
try {
c.executeMethod(method);
}
catch(...) {
}
finally {
method.releaseConnection();
connman.shutdown();
}
Connman.shutdown () performans sorunları yaşar mı?
50 ++ iş parçacığı kullanan uygulama için hangi yöntemin (A veya B) daha iyi olduğunu öğrenebilir miyim?