解决此问题的java httpclient 4.x性能指南

解决此问题的java httpclient 4.x性能指南,java,performance,apache-httpclient-4.x,Java,Performance,Apache Httpclient 4.x,有一篇关于http性能、池、e.t.c的好文章。 在最新的4.x版本中找不到相同的。有人看到了吗?我在重载情况下遇到性能问题,希望解决这些问题。 我使用的是4.1版本。 以下是分析器输出: 26% org.apache.http.impl.client.CloseableHttpClient.execute(multiple parameter matches) :26,107,40 26% org.apache.http.impl.client.CloseableHttpClient.exec

有一篇关于http性能、池、e.t.c的好文章。 在最新的4.x版本中找不到相同的。有人看到了吗?我在重载情况下遇到性能问题,希望解决这些问题。 我使用的是4.1版本。 以下是分析器输出:

26% org.apache.http.impl.client.CloseableHttpClient.execute(multiple parameter matches) :26,107,40
26% org.apache.http.impl.client.CloseableHttpClient.execute(org.apache.http.client.methods.HttpUriRequest, org.apache.http.protocol.HttpContext) :82,46
26% org.apache.http.impl.client.AbstractHttpClient.doExecute(org.apache.http.HttpHost, org.apache.http.HttpRequest, org.apache.http.protocol.HttpContext) :882,818
26% org.apache.http.impl.client.AbstractHttpClient.createHttpContext() :301
26% org.apache.http.impl.client.AbstractHttpClient.getConnectionManager() :484
26% org.apache.http.impl.client.AbstractHttpClient.createClientConnectionManager() :321
26% org.apache.http.impl.conn.SchemeRegistryFactory.createDefault() :52
26% org.apache.http.conn.ssl.SSLSocketFactory.getSocketFactory() :168
26% org.apache.http.conn.ssl.SSLContexts.createDefault() :58
26% javax.net.ssl.SSLContext.init(javax.net.ssl.KeyManager[], javax.net.ssl.TrustManager[], java.security.SecureRandom) :283
26% sun.security.ssl.SSLContextImpl.engineInit(javax.net.ssl.KeyManager[], javax.net.ssl.TrustManager[], java.security.SecureRandom) :83,92
26% javax.net.ssl.TrustManagerFactory.init(java.security.KeyStore) :250
26% sun.security.ssl.TrustManagerFactoryImpl.engineInit(java.security.KeyStore) :51
26% sun.security.ssl.TrustManagerFactoryImpl.getCacertsKeyStore(java.lang.String) :221
26% java.security.KeyStore.load(java.io.InputStream, char[]) :1214
26% sun.security.provider.JavaKeyStore$JKS.engineLoad(java.io.InputStream, char[]) :55
26% sun.security.provider.JavaKeyStore.engineLoad(java.io.InputStream, char[]) :723,747
26% java.security.cert.CertificateFactory.generateCertificate(java.io.InputStream) :339
26% sun.security.provider.X509Factory.engineGenerateCertificate(java.io.InputStream) :93
26% sun.security.provider.X509Factory.getFromCache(sun.security.util.Cache, byte[]) :203
我有4种方法使用httpclient通过HTTP发送一些数据,每种方法都消耗总时间的25%。其余的处理需要毫秒。看来我用错了httpclient

编辑: 参见oleg答案+阅读 回答所有相关问题

主要部分包括: 构建池管理器的好方法

PoolingHttpClientConnectionManager cm = new PoolingHttpClientConnectionManager();
// Increase max total connection to 200
cm.setMaxTotal(200);
// Increase default max connection per route to 20
cm.setDefaultMaxPerRoute(20);
// Increase max connections for localhost:80 to 50
HttpHost localhost = new HttpHost("locahost", 80);
cm.setMaxPerRoute(new HttpRoute(localhost), 50);

CloseableHttpClient httpClient = HttpClients.custom()
        .setConnectionManager(cm)
        .build();
一种并发使用HttpClient的方法

//While HttpClient instances are thread safe and can be shared
//between multiple threads of execution, it is highly recommended that 
//each thread maintains its own dedicated instance of HttpContext .


static class GetThread extends Thread {

    private final CloseableHttpClient httpClient;
    private final HttpContext context;
    private final HttpGet httpget;

    public GetThread(CloseableHttpClient httpClient, HttpGet httpget) {
        this.httpClient = httpClient;
        this.context = HttpClientContext.create();
        this.httpget = httpget;
    }

    @Override
    public void run() {
        try {
            CloseableHttpResponse response = httpClient.execute(
                    httpget, context);
            try {
                HttpEntity entity = response.getEntity();
            } finally {
                response.close();
            }
        } catch (ClientProtocolException ex) {
            // Handle protocol errors
        } catch (IOException ex) {
            // Handle I/O errors
        }
    }

}

主要建议仍然与3.1相同


请重新使用HttpClient实例!HttpClient实例非常昂贵。通过扔掉它,不仅扔掉了实例本身,还扔掉了SSL上下文、连接管理器和所有可能由连接管理器保持活动状态的持久连接

谢谢,听起来很简单。我有点困惑。我是否必须只关闭响应对象?足够了吗?当不再需要HttpClient实例时,应该关闭它。在使用实例时,应该关闭响应对象,以确保正确释放回池的连接有任何连接池示例吗?还是隐式地进行此池?那么并发性呢?跨不同线程共享单个HttpClient实例是否节省?因此我可以在HttpSevlet.init方法中实例化单个HttpClient实例,然后同时使用它?我发现在每次调用时释放连接可以防止连接泄漏。httpget.releaseConnection()。。