2

我有以下使用 a 的代码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();
        }
    }
}

我的问题是,当我关闭池(通过设置<= 0)时,与池打开( > 0)poolSize相比,代码的执行速度要快得多。poolSize这两个版本之间的唯一区别是,当使用池时,只有一个HttpClientcreated 实例(如 Apache 推荐的那样),而当池关闭时,HttpClient会创建多个实例。当我使用 HTTP 连接池时,代码应该执行得更好。但这并没有发生。你看到我使用连接管理器有什么问题吗?

4

1 回答 1

0

您不能基于此做出任何有效且受支持的诊断。为了找出您的应用程序运行得更快/更慢的原因,您需要收集信息,为此您需要进行性能测试。否则你只会在黑暗中射击。

对于您的案例,我将在您的测试期间开始测量整体系统性能,确保两个测试案例都使用相同类型的工作负载。

首先,整体系统性能是指 CPU 和内存上的利用率、饱和度和错误。您需要找出您的代码执行时间在哪里,并从那里开始更深入地挖掘。

于 2014-05-26T20:09:38.343 回答