我有以下使用PoolingClientConnectionManager
:
public static void main(String[] args) {
int NoOfSimultaneousRequest = 1000;
int poolsize =1000;
try{
if (poolsize>0){
mgr = new PoolingClientConnectionManager();
mgr.setMaxTotal(poolsize);
mgr.setDefaultMaxPerRoute(poolsize);
httpclient = new DefaultHttpClient(mgr);
}
Thread [] tr = new Thread[NoOfSimultaneousRequest];
for(int i=0;i<NoOfSimultaneousRequest;i++){
MultipleThreadsTest multiTest = new MultipleThreadsTest();
Thread t = new Thread(multiTest);
tr[i] = new Thread(multiTest);
}
for(int i=0;i<NoOfSimultaneousRequest;i++){
tr[i].start();
}
for(int i=0;i<NoOfSimultaneousRequest;i++){
tr[i].join();
}
}catch (Exception e){
e.printStackTrace();
}finally{
if (mgr!=null){
mgr.shutdown();
}
if (httpclient!=null){
httpclient.getConnectionManager().shutdown();
}
}
}
public void run() {
if (mgr==null){ //if no connection manager then create multiple instances of defaulthttpClient
HttpClient hc = new DefaultHttpClient();
response = invokeWebService(hc,"http://urltoPost") ;
}else{ //if connection manager is used then use only one instance of httpclient
response = invokeWebService(httpclient,"http://urltoPost") ;
}
}
private static String invokeWebService(HttpClient httpClient,String url){
HttpPost httpPost = new HttpPost(new URI(url));
try{
String response = httpClient.execute(httpPost,new BasicResponseHandler());
return response;
}catch(Exception e){
}finally{
if (httpPost != null) {
httpPost.releaseConnection();
}
}
}
我的问题是,当我关闭池时(通过设置poolSize
&lt; = 0),与池化(poolSize
&gt; 0)时相比,代码的执行速度要快得多。这两个版本之间的唯一区别是,在使用池时,只创建了HttpClient
的一个实例(由Apache推荐),当池关闭时,会创建多个HttpClient
实例。当我使用HTTP连接池时,代码应该表现得更好。但那并没有发生。您是否在使用连接管理器时发现任何问题?
答案 0 :(得分:0)
您无法根据此进行任何有效且受支持的诊断。为了找出应用程序运行速度更快/更慢的原因,您需要收集信息,为此您需要进行性能测试。否则你只会在黑暗中拍摄。
首先,我会在测试期间开始测量整体系统性能,确保两个测试用例都使用相同类型的工作负载。
通过整体系统性能,我的意思是CPU和内存的利用率,饱和度和错误。您需要找出代码执行时间的去向,并从那里开始深入挖掘。