爬虫中的连接池

xclxcl 2020-06-13

在前面的内容中已经可以深刻的体会到,不管是post请求还是get请求,每次都要创建HttpClient,会出现频繁的创建和销毁问题。

对于上面的问题我们可以使用连接池来解决

具体代码:

package cn.itcast.crawler.test;import org.apache.http.client.methods.CloseableHttpResponse;import org.apache.http.client.methods.HttpGet;import org.apache.http.impl.client.CloseableHttpClient;import org.apache.http.impl.client.HttpClients;import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;import org.apache.http.util.EntityUtils;import java.io.IOException;public class HttpClientPoolTest {    public static void main(String[] args) {        //创建连接池管理器        PoolingHttpClientConnectionManager cm=new PoolingHttpClientConnectionManager();        //设置最大连接数        cm.setMaxTotal(100);        //设置每个主机的最大连接数        cm.setDefaultMaxPerRoute(10);        //使用连接池管理器发起请求        doGet(cm);        doGet(cm);    }    private static void doGet(PoolingHttpClientConnectionManager cm) {        //这样操作以后及不是每次都创建新的HttpClient,而是从连接池中获取       CloseableHttpClient httpClient= HttpClients.custom() .setConnectionManager(cm).build();        HttpGet httpGet=new HttpGet("http://www.itcast.cn");        CloseableHttpResponse response=null;        try {            response=httpClient.execute(httpGet);            if(response.getStatusLine().getStatusCode()==200){                String content=EntityUtils.toString(response.getEntity(),"utf8");                System.out.println(content.length());            }        } catch (IOException e) {            e.printStackTrace();        }finally {            if(response!=null){                try {                    response.close();                } catch (IOException e) {                    e.printStackTrace();                }                //不能关闭httpClient,因为它由连接池进行管理了                //httpClient.close();            }        }    }}对于这个连接池是否有作用,可以通过打断点来查看

相关推荐