httpclient连接池的配置方法

HttpClient和Lucene一样,每个版本的API都变化很大,这有点让人头疼。

笔者碰到的情况最早在hadoop环境用httpclient发起httpjson请求,在本地调试的时候用的4.5.2版本,放到hadoop环境中运行报错,无奈只好将httpclient降级成4.2.5版本。最后终于用了低版本的httpclient完成了任务。

如下是我这边整理了一下两个版本连接池的方法:

1、httpclient4.X版本以上,httpclient4.3版本过时:

/**
     *
     * 避免HttpClient的”SSLPeerUnverifiedException: peer not authenticated”异常
     * 不用导入SSL证书 私有函数,初始化连接池
     *因大部分的hadoop本身带的httpclient4.2.5版本,故将4.X的部分放到这个地方
     * @param maxTotalConn
     *            最大连接数
     * @param maxRouteConn
     *            每路由最大连接数
     */
    private synchronized void initConnManager(int maxTotalConn, int maxRouteConn) {
        try {
            SSLContext ctx = SSLContext.getInstance("TLS");
            X509TrustManager tm = new X509TrustManager() {
                @Override
                public void checkClientTrusted(
                        java.security.cert.X509Certificate[] arg0, String arg1)
                        throws java.security.cert.CertificateException {
                }

                @Override
                public void checkServerTrusted(
                        java.security.cert.X509Certificate[] arg0, String arg1)
                        throws java.security.cert.CertificateException {
                }

                @Override
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
            };
            ctx.init(null, new TrustManager[] { tm }, null);

            SSLSocketFactory ssf = new SSLSocketFactory(ctx,
                    SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);

            SchemeRegistry schemeRegistry = new SchemeRegistry();
            schemeRegistry.register(new Scheme("http", 80, PlainSocketFactory
                    .getSocketFactory()));
            schemeRegistry.register(new Scheme("https", 443, ssf.getSocketFactory()));

            cm = new ThreadSafeClientConnManager(schemeRegistry);
            cm.setMaxTotal(maxTotalConn);
            cm.setDefaultMaxPerRoute(maxRouteConn);
        } catch (KeyManagementException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

2、httpclient4.3以上版本:

/**
     * 获得https的连接
     * 避免HttpClient的”SSLPeerUnverifiedException: peer not authenticated”异常
     * 不用导入SSL证书.
     * 私有函数,初始化连接池
     *
     * @param maxTotalConn
     *            最大连接数
     * @param maxRouteConn
     *            每路由最大连接数
     */
    private synchronized void initConnManager(int maxTotalConn, int maxRouteConn) {
        try {
            SSLContext ctx = SSLContext.getInstance("TLS");
            X509TrustManager tm = new X509TrustManager() {
                @Override
                public void checkClientTrusted(
                        java.security.cert.X509Certificate[] arg0, String arg1)
                        throws java.security.cert.CertificateException {
                }

                @Override
                public void checkServerTrusted(
                        java.security.cert.X509Certificate[] arg0, String arg1)
                        throws java.security.cert.CertificateException {
                }

                @Override
                public java.security.cert.X509Certificate[] getAcceptedIssuers() {
                    return null;
                }
            };
            ctx.init(null, new TrustManager[] { tm }, new SecureRandom());
            SSLConnectionSocketFactory socketFactory = new SSLConnectionSocketFactory(
                    ctx, NoopHostnameVerifier.INSTANCE);
            ConnectionSocketFactory plainsf = PlainConnectionSocketFactory
                    .getSocketFactory();
            Registry<ConnectionSocketFactory> registry = RegistryBuilder
                    .<ConnectionSocketFactory> create()
                    .register("http", plainsf).register("https", socketFactory)
                    .build();
            cm = new PoolingHttpClientConnectionManager(registry);
            // 将最大连接数增加
            cm.setMaxTotal(maxTotalConn);
            // 将每个路由基础的连接增加
            cm.setDefaultMaxPerRoute(maxRouteConn);
        } catch (Exception e) {
            e.printStackTrace();
            throw new RuntimeException();
        }
    }

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Doris是一个分布式列式存储系统,它提供了高性能和高可靠性的数据存储和查询服务。在使用Doris时,可以通过连接池来管理数据库连接,以提高系统的性能和效率。 在Doris中,连接池的设置可以通过配置文件进行调整。以下是一些常见的连接池设置选项: 1. 最大连接数(maxConnections):指定连接池中允许的最大连接数。超过这个数目的连接请求将被阻塞,默认值为100。 2. 最小空闲连接数(minIdleConnections):指定连接池中保持的最小空闲连接数。当连接池中的连接数低于这个数目时,连接池会自动创建新的连接,默认值为10。 3. 最大空闲连接数(maxIdleConnections):指定连接池中允许的最大空闲连接数。当连接池中的空闲连接数超过这个数目时,多余的连接将被关闭,默认值为50。 4. 连接超时时间(connectionTimeout):指定从连接池获取连接的超时时间。如果在指定时间内无法获取到可用连接,则会抛出异常,默认值为30秒。 5. 连接最大存活时间(maxConnectionLifetime):指定连接在连接池中的最大存活时间。超过这个时间的连接将被关闭,默认值为0,表示不限制存活时间。 6. 连接回收时间间隔(connectionIdleTimeout):指定连接在连接池中的空闲时间超过多久后会被回收,默认值为10分钟。 这些是一些常见的连接池设置选项,可以根据实际需求进行调整。通过合理设置连接池参数,可以提高Doris系统的性能和稳定性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值