httpclient使用连接池

http协议是无状态的,但毕竟是基于tcp的,底层还是需要和服务器连接的,
对于需要从同一个站点抓取大量网页的程序,应该使用连接池,否则每次抓取都和web站点建立连接,发送请求,获得响应,释放连接.
一方面效率不高
一方面不小心就会疏忽某些资源的释放,导致站点拒绝连接(很多站点会拒绝大量连接,防止Dos攻击)

httpclient连接池

httpclient从4.2版本开始抛弃了先前的
SingleClientClientConnManger和ThreadSafeConnManger取而代之的是BasicClientConnectionManger和PoolingClientConnectionManager
BasicClientConnectionManager
该类内部只维护了一个活动的connection,尽管这个类是线程安全的,但是最好在一个单独的线程中重复使用它。
如果在同一个BasicClientConnectionManager对象中,
* 多次请求与先前请求时同一个route,那么BasicClientConnectManager会使用同一个连接完成后续请求,
*否则,BasicClientConnectionManager会将先前的connection关闭,然后为后续请求创建一个新的连接。
也就是说BasicClientConnectionManager会尽量使用同一个BasicClientConnectionManager完成
PoolClientConnectionManager
该类可以在多个线程中使用,连接按照route被缓存(pooled),当后续请求route请求已经在pool中存在,就会使用pool中先前使用的connection获取请求。
PoolClientonnectionManager对每个route维护的connection数目有上限要求,
默认每个route最多维护两个并发线程的connection连接,
整个pool最多容纳20个并发connection。(可以通过设置来修改这些限制)

BasicClientConnectionManager

public static void basicClientTest() throws Exception{
 HttpClient httpclient = new DefaultHttpClient();
 HttpGet httpGet = new HttpGet("http://m.weather.com.cn/data/101010100.html");
 HttpResponse response=httpClient.execute(httpGet);
 String result = EntityUtils.toString(response.getEntity(),charset.forName("utf-8"));
 System.out.println(result);
 httpClient.getConnectionManager().shutdowm();
}
PoolingClientConnectionManager
SchemeRegistry schemeRegistry = new SChemeRegistry();
schemeRegistry.register(new Scheme("http",80,PlainSocketFactory.getSocketFactory()));
schemeRegistry.register(new Scheme("https",443,SSLSocketFactory.getSocketFactory()));

HttpHost baidu = new HttpHost("www.baidu.com",80);
HttpHost local = new HttpHost("127.0.0.1",8090);

PoolingClientConnectionManager cm = new PoolingClientConnectionManager(schemeRegistry);
cm.setMaxPerRoute(new HttpRoute(baidu),30);
cm.setMaxPerRoute(new HttpRoute(local),50);

连接池使用总结

1) 首先配置最大连接数和最大路由连接数,如果连接的url只有一个,两个必须配置成一样,否则只会去最小值
(默认最大连接数是20,每个路由最大连接是2)

2) 最好配置httpclient的等待时间和响应时间.否则就会一直等待
HttpParams httpparams = new BasicHttpParams();
httpparams.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT,CONNECT_TIMEOUT);
httpparams.setParameter(CoreConnectionPNames.SO_TIMEOUT,READ_TIMEOUT);

3) httpClient必须releaseConnection,但不是abort。因为releaseconnection是归还连接到到连接池,而abort是直接抛弃这个连接,
而且占用连接池的数目。
HttpGet httpget = new HttpGet(url);
httpGet.releaseConnection();

4) httpclient设置的最大连接数绝对不能操作tomcat设置的最大连接数,否则tomcat的连接就会被httpclient连接池一直占用,直到系统挂掉。

5) 可以使用tomcat的长连接和httpclient连接池和合理使用来增加系统响应速度
cm.setMaxTotal(200);//创建socket的上线是200
cm.setDefaultMaxPerRoute(20);//默认对每个指定连接的服务器(指定的ip)可以创建并发20socket进行访问

httpclient httpclient使用连接池的更多相关文章

  1. HttpClient 4.3连接池参数配置及源码解读

    目前所在公司使用HttpClient 4.3.3版本发送Rest请求,调用接口.最近出现了调用查询接口服务慢的生产问题,在排查整个调用链可能存在的问题时(从客户端发起Http请求->ESB-&g ...

  2. springboot使用RestTemplate+httpclient连接池发送http消息

    简介 RestTemplate是spring支持的一个请求http rest服务的模板对象,性质上有点像jdbcTemplate RestTemplate底层还是使用的httpclient(org.a ...

  3. HttpClient4.5.2 连接池原理及注意事项

    随着微服务的流行,服务之间的http调用越来越多,遇到的问题也比较多,写这边文章的目的也是将自己遇到的坑和解决方案跟大家分享 一.为什么要用Http连接池 1.降低延迟:如果不采用连接池,每次连接发起 ...

  4. spring-boot RestTemplate 连接池

    以前我们项目都是基于Apache HttpClient 连接池进行web 接口调用,后来用spring-boot, 发现 RestTemplate 挺好用. 简单介绍下: 什么是RestTemplat ...

  5. RestTemplate连接池(转载)

    出处:http://zhangzhi19861216.cnblogs.com/ spring-boot RestTemplate 连接池 以前我们项目都是基于Apache HttpClient 连接池 ...

  6. HttpClient连接池的连接保持、超时和失效机制

    HTTP是一种无连接的事务协议,底层使用的还是TCP,连接池复用的就是TCP连接,目的就是在一个TCP连接上进行多次的HTTP请求从而提高性能.每次HTTP请求结束的时候,HttpClient会判断连 ...

  7. HttpClient连接池抛出大量ConnectionPoolTimeoutException: Timeout waiting for connection异常排查

    转自: http://blog.csdn.net/shootyou/article/details/6615051 今天解决了一个HttpClient的异常,汗啊,一个HttpClient使用稍有不慎 ...

  8. Http持久连接与HttpClient连接池

    一.背景 HTTP协议是无状态的协议,即每一次请求都是互相独立的.因此它的最初实现是,每一个http请求都会打开一个tcp socket连接,当交互完毕后会关闭这个连接. HTTP协议是全双工的协议, ...

  9. Http 持久连接与 HttpClient 连接池

    一.背景 HTTP协议是无状态的协议,即每一次请求都是互相独立的.因此它的最初实现是,每一个http请求都会打开一个tcp socket连接,当交互完毕后会关闭这个连接. HTTP协议是全双工的协议, ...

  10. HttpClient官方sample代码的深入分析(连接池)

    前言   之前一直使用apache的httpclient(4.5.x), 进行http的交互处理. 而httpclient实例则使用了http连接池, 而一旦涉及到连接池, 那会不会在使用上有些隐藏很 ...

随机推荐

  1. 20145208 蔡野 《网络对抗》Exp4 恶意代码分析

    20145208 蔡野 <网络对抗>Exp4 恶意代码分析 问题回答 总结一下监控一个系统通常需要监控什么.用什么来监控. 监控一个系统通常需要监控这个系统的注册表,进程,端口,服务还有文 ...

  2. 使用CSP防止XSS攻击

    转载自阮一峰博客:http://www.ruanyifeng.com/blog/2016/09/csp.html 跨域脚本攻击 XSS 是最常见.危害最大的网页安全漏洞. 为了防止它们,要采取很多编程 ...

  3. STM32定时器的预装载寄存器与影子寄存器之间的关系【转】

    首先转载:   STM32定时器的预装载寄存器与影子寄存器之间的关系 本文的说明依据STM32参考手册(RM0008)第10版:英文:http://www.st.com/stonline/produc ...

  4. Git入门私房菜

    昨天下午参考廖雪峰的博客和其他一些文章,简单了解了一下传说中的Git,发现常见用法入门还是挺容易上手的,在此做一些笔记,方便以后查阅和复习. Git安装 Linux sudo apt-get inst ...

  5. LightOJ 1296 Again Stone Game(sg函数)题解

    题意:每次必须拿且只能拿不超过一半的石头,不能拿为败 思路:显然算出每个的sg函数,但是范围1e9显然不能直接打表.所以先打表找规律,发现偶数一直是自己的一半,奇数好像没规律.偶数x的sg函数值是x/ ...

  6. [Redis] - redis实战

    Microsoft Windows [版本 10.0.17134.472] (c) Microsoft Corporation.保留所有权利. C:\Users\SeeClanUkyo>f: F ...

  7. java web项目配置https访问

      转载: tomcat6配置:  1.单向认证,就是传输的数据加密过了,但是不会校验客户端的来源  2.双向认证,如果客户端浏览器没有导入客户端证书,是访问不了web系统的,找不到地址  如果只是加 ...

  8. Pyinstaller 中 pandas出错问题的解决(详细)

    环境配置 pip install pyinstaller pyinstaller中的参数 -F 表示生成单个可执行文件 -c 显示命令行窗口,一般一开始的时候使用,如果没有错误,那就使用-w命令 -w ...

  9. python profile性能分析

    #! /usr/bin/env python # encoding=utf8 import profile def func1(): for i in range(1000): pass def fu ...

  10. Eclipse如何快速改变主题颜色

    厌倦了Eclipse的白底黑子,我们来更换下Eclipse的主题颜色,让眼睛更舒服一点 首先先进入网址:http://eclipsecolorthemes.org/ 选择一个主题进入,点击进入如下: ...