當前位置:編程學習大全網 - 源碼下載 - httpclient連接池使用及簡單分析

httpclient連接池使用及簡單分析

連接池是為了復用連接而存在的,就像線程池壹樣,創建了的線程在執行完成任務後不銷毀,而是放入池中待命,以便執行下次任務的時候可以直接從池中取出線程執行,而不是先創建線程再執行,省去了創建線程帶來的開銷和時間。http連接也是壹樣的思路,http1.1支持了 keep-alive ,我們再對同壹個網址進行請求的時候,就可以不用每次都建立連接;

我們都知道,http建立連接的過程是比較繁瑣的,要經歷3次握手和4次揮手,那麽省去這個建立連接的過程在高並發的時候就會比較的有必要;同時,類似線程池,總有壹個最大的線程數,和線程失效時間,因為在任務空閑的時候,這些空閑線程占用系統資源,所以我們要釋放空閑時間長的線程。同樣對於http連接,使用的是tcp的長連接,但是長連接的持有是非常耗資源的,特別是對於服務端,鏈接數是有限的,所以我們同樣需要釋放壹定時間空閑的連接;

對自己的系統有正確的預估:

httpclient給我們提供了 PoolingHttpClientConnectionManager 這個類幫助我們來管理連接(版本4.5及以上)。在我們使用httpclient的時候,如果配置了這個連接管理,那麽就會通過這個來按host管理連接;

還是壹樣,最簡單的用法先來壹個使用單例的:

這樣每次要使用http請求的時候,從這個工具中獲取客戶端來使用

為什麽要使用單例呢?其實直接 HttpClients.custom().setDefaultRequestConfig(requestConfig).build(); 同樣也是使用了連接池的,可以看build中的源碼,沒有設置manager的時候默認有壹個。既然要管理連接池,那麽這個管理器就只能有壹個,不然管理就亂了,所以我們在使用的時候,只需要要壹個 CloseableHttpClient ,這個client配置壹個連接池的管理,每次使用都去找他才能達到連接管理的目的,否則這樣寫:

每次使用的時候都新建壹個客戶端,每個客戶端是獨立的,這樣的話每次使用都完全是從頭來壹次。就好像使用線程池的時候,每次都是壹個新的ExecutorService。

的確我見過人家配置了壹堆的東西:

對於第三點,當我看到人家自己實現的定時檢測任務的時候,我就在想,壹個成熟的框架,人家不知至於想不到這點,那麽就去看看它到底有沒有做這件事。果然,框架的確考慮到了,但是這個默認沒有開啟,先看源碼:在類 HttpClientBuilder 中

可以看到,在 evictExpiredConnections 或者 evictIdleConnections 其中壹個屬性是true的時候,就會開啟定時檢測關閉連接的任務,那麽我們就可以使用這樣的方式來開啟它:

關於這些東西的使用,官方文檔也有描述,但是描述的時候,他不會和妳解釋為什麽,所以有的時候,看看源碼就能理解它為什麽要這樣做以及他是如何做到這些的,httpclient的配置可不止這些,如果使用的話可以先看看它有沒有幫我們實現,沒有的話再去自己做;

  • 上一篇:騰訊是不是個陰謀
  • 下一篇:三金叉見底是什麽?
  • copyright 2024編程學習大全網