HttpClient連線池原理及一次連線時序圖
HttpClient是一個實現了http協議的開源Java客戶端工具庫,可以通過程式傳送http請求。
1.1.HttpClient傳送請求和接收響應
1.1.1.程式碼示例
以Get請求為例,以下程式碼獲得google主頁內容並將返回結果打印出來。
public final static void main(String[] args) throws Exception {
HttpClient httpclient = new DefaultHttpClient();
try {
HttpGet httpget = new HttpGet("http://www.google.
System.out.println("executing request " + httpget.getURI());
// 建立response處理器
ResponseHandler<String> responseHandler = new BasicResponseHandler();
String responseBody = httpclient.execute(httpget, responseHandler);
System.out.println("----------------------------------------");
System.out.println(responseBody);
System.out.println("----------------------------------------");
} finally {
//HttpClient不再使用時,關閉連線管理器以保證所有資源的釋放
httpclient.getConnectionManager().shutdown();
}
}
1.1.2.時序圖
httpClient執行一次請求,即執行一次httpclient.execute()方法,時序圖如下:
1.1.3. 時序圖說明
1.1.3.1.時序圖編號說明
²1.1、1.2、1.3等均為操作1的子操作,即:操作1 execute()中又分別呼叫了操作1.1 createClientConnectionManager()、操作1.2 createClientRequestDirector()以及操作1.3 requestDirector 物件的execute()方法等,以此類推。
²按時間先後順序分別編號為1,2,3等,以此類推。
1.1.3.2.主要類說明
²對於圖中各物件,httpClient jar包中均提供對應的介面及相應的實現類。
²圖中直接與伺服器進行socket通訊的是最右端介面OperatedClientConnection某一實現類的物件,圖中從右到左進行了層層的封裝,最終開發人員直接使用的是介面HttpClient某一實現類的物件進行請求的傳送和響應的接收(如2.1.1程式碼示例)。
²時序圖中各物件所在類關係如下圖類圖所示(僅列出圖中所出現的各個類及方法,引數多的方法省略部分引數,其他類屬性和操作請參照原始碼):
1.1.3.2.1.介面OperatedClientConnection
²該介面對應一個http連線,與伺服器端建立socket連線進行通訊。
1.1.3.2.2.介面ManagedClientConnection
²該介面對一個http連線OperatedClientConnection進行封裝,ManagedClientConnection維持一個PoolEntry<HttpRoute, OperatedClientConnection>路由和連線的對應。提供方法獲得對應連線管理器,對http連線的各類方法,如建立連線,獲得相應,關閉連線等進行封裝。
1.1.3.2.3.介面RequestDirector
²RequestDirector為訊息的傳送執行者,該介面負責訊息路由的選擇和可能的重定向,訊息的鑑權,連線的分配回收(呼叫ClientConnectionManager相關方法),建立,關閉等並控制連線的保持。
²連線是否保持以及保持時間預設原則如下:
n連線是否保持:客戶端如果希望保持長連線,應該在發起請求時告訴伺服器希望伺服器保持長連線(http 1.0設定connection欄位為keep-alive,http 1.1欄位預設保持)。根據伺服器的響應來確定是否保持長連線,判斷原則如下:
u檢查返回response報文頭的Transfer-Encoding欄位,若該欄位值存在且不為chunked,則連線不保持,直接關閉。其他情況進入下一步。
u檢查返回的response報文頭的Content-Length欄位,若該欄位值為空或者格式不正確(多個長度,值不是整數),則連線不保持,直接關閉。其他情況進入下一步
u檢查返回的response報文頭的connection欄位(若該欄位不存在,則為Proxy-Connection欄位)值
l如果這倆欄位都不存在,則http 1.1版本預設為保持,將連線標記為保持, 1.0版本預設為連線不保持,直接關閉。
l如果欄位存在,若欄位值為close 則連線不保持,直接關閉;若欄位值為keep-alive則連線標記為保持。
n連線保持時間:連線交換至連線管理時,若連線標記為保持,則將由連線管理器保持一段時間;若連線沒有標記為保持,則直接從連線池中刪除並關閉entry。連線保持時,保持時間規則如下:
u保持時間計時開始時間為連線交換至連線池的時間。
u保持時長計算規則為:獲取keep-alive欄位中timeout屬性的值,
l若該欄位存在,則保持時間為 timeout屬性值*1000,單位毫秒。
l若該欄位不存在,則連線保持時間設定為-1,表示為無窮。
n響應頭日誌示例:
17:59:42.051 [main] DEBUG org.apache.http.headers - << Keep-Alive: timeout=5, max=100
17:59:42.051 [main] DEBUG org.apache.http.headers - << Connection: Keep-Alive
17:59:42.051 [main] DEBUG org.apache.http.headers - << Content-Type: text/html; charset=utf-8
17:59:42.062 [main] DEBUG c.ebupt.omp.sop.srmms.SopHttpClient - Connection can be kept alive for 5000 MILLISECONDS
n若需要修改連線的保持及重用預設原則,則需編寫子類繼承自AbstractHttpClient,分別覆蓋其createConnectionReuseStrategy() 和createConnectionKeepAliveStrategy() 方法。
1.1.3.2.4.介面ClientConnectionManager
²ClientConnectionManager為連線池管理器,是執行緒安全的。Jar包中提供的具體實現類有BasicClientConnectionManager和PoolingClientConnectionManager。其中BasicClientConnectionManager只管理一個連線。PoolingClientConnectionManager管理連線池。
²若有特殊需要,開發人員可自行編寫連線管理器實現該介面。
²連線管理器自動管理連線的分配以及回收工作,並支援連線保持以及重用。連線保持以及重用由RequestDirector進行控制。
1.1.3.2.5.介面HttpClient
²介面HttpClient為開發人員直接使用的傳送請求和接收響應的介面,是執行緒安全的。jar包中提供的實現類有:AbstractHttpClient, DefaultHttpClient, AutoRetryHttpClient, ContentEncodingHttpClient, DecompressingHttpClient, SystemDefaultHttpClient。其中其他所有類都繼承自抽象類AbStractHttpClient,該類使用了門面模式,對http協議的處理進行了預設的封裝,包括預設連線管理器,預設訊息頭,預設訊息傳送等,開發人員可以覆蓋其中的方法更改其預設設定。
²AbstractHttpClient預設設定連線管理器為BasicClientConnectionManager。若要修改連線管理器,則應該採用以下方式之一:
n初始化時,傳入連線池,例如:
ClientConnectionManager connManager= new PoolingClientConnectionManager();
HttpClient httpclient = new DefaultHttpClient(connManager);
n編寫httpClient介面的實現類,繼承自AbstractHttpClient並覆蓋其createClientConnectionManager()方法,在方法中建立自己的連線管理器。
1.1.3.3.方法說明
²createClientConnectionManager(),建立連線池,該方法為protected。子類可覆蓋修改預設連線池。
²createClientRequestDirector(),建立請求執行者,該方法為protected。子類可覆蓋但一般不需要。
²httpClient中呼叫1.2方法所建立的請求執行者requestDirector的execute()方法。該方法中依次呼叫如下方法:
n1.3.1呼叫連線管理器的requestConnection(route, userToken)方法,該方法呼叫連線池httpConnPool的lease方法,建立一個Future<HttpPoolEntry>。Futrue用法參見Java標準API。返回clientConnectionRequest。
n1.3.2.呼叫clientConnectionRequest的getConnection(timeout, TimeUnit.MILLISECONDS)方法,該方法負責將連線池中可用連線分配給當前請求,具體如下:
u建立clientConnectionOperator。
u執行1.3.1中建立的Future的任務,該任務獲得當前可用的poolEntry<router,OperatedClientConnection>並封裝成managedClientConnectionImpl返回。
n1.3.3. 呼叫 tryConnect(roureq, context)方法,該方法最終呼叫OperatedClientConnection的openning方法,與伺服器建立socket連線。
n1.3.4. 呼叫 tryExecute(roureq, context)方法,該方法最終呼叫OperatedClientConnection的receiveResponseHeader()和receiveResponseEntity()獲得伺服器響應。
n1.3.5 判斷連線是否保持用來重用,若保持,則設定保持時間,並將連線標記為可重用不保持則呼叫managedClientConnectionImpl的close方法關閉連線,該方法最終呼叫OperatedClientConnection的close()方法關閉連線。
²最終respose返回至httpClient。
²傳送請求的執行緒需處理當前連線,若已被標記為重用,則交還至連線池管理器;否則,關閉當前連線。(使用響應處理器ResponseHanler)。本次請求結束。
1.2.httpClient連線池
若連線管理器配置為PoolingClientConnectionManager,則httpClient將使用連線池來管理連線的分配,回收等操作。
1.2.1.連線池結構
連線池結構圖如下,其中:
HttpClient是一個實現了http協議的開源Java客戶端工具庫,可以通過程式傳送http請求。
1.1.HttpClient傳送請求和接收響應
1.1.1.程式碼示例
以Get請求為例,以下程式碼獲得google主頁內容並將返回結果打印出
1、運作原理
在實際應用開發中,特別是在WEB應用系統中,如果JSP、Servlet或EJB使用
JDBC直接訪問資料庫中的資料,每一次資料訪問請求都必須經歷建立資料庫連線、開啟資料庫、存取資料和關閉資料庫連線等步驟,而連線並開啟資料庫是一件既消耗資源又費時的工作,如果頻繁發生這種資料庫操作,系 隨著微服務的流行,服務之間的http呼叫越來越多,遇到的問題也比較多,寫這邊文章的目的也是將自己遇到的坑和解決方案跟大家分享
一、為什麼要用Http連線池
1、降低延遲:如果不採用連線池,每次連線發起Http請求的時候都會重新建立TCP連線(經歷3次握手),用完就會關閉連線(4次揮手),如果採用連線池則減
以下為自己綜合N多 視訊/部落格 資料之後的理解:
1. 基於最原始的JDBC及JDBC-MySQL 驅動來使用MySQL資料庫時經常會使用以下程式碼:
//1.驅動註冊程式
Class.forName("com.mysql.jdbc.Driver");
大家好,我是IT修真院西安分院第4期的JAVA學員,一枚正直純潔善良的JAVA程式設計師。
今天給大家分享一下,修真院官網Java任務1,深度思考中的知識點JDBC連線池原理
一、.背景介紹
什麼是連線池
1)連線池,首先從字面意思理解,這是一個偏正短語
在SpringBoot2.x的預設連線池是hikari。我們可以通過spring-boot-starter-jdbc的依賴發現。但是HikariCP應該是目前速度最快的連線池了。
1.hikari連線池使用
pom.xml中jdbc的三座標
<depen
HiKariCP是資料庫連線池的一個後起之秀,號稱效能最好,可以完美地PK掉其他連線池。
原文地址:http://blog.csdn.net/clementad/article/details/46928621
官網:https://github.com/brettwooldridge/Hi 一、一點說明:
(本文的知識點來自C#執行緒參考手冊)
物件池在企業軟體中非常常見,為了提供應用的效能,必須控制物件例項的建立。比如建立資料庫連線物件,每一次建立的代價非常高昂,每一次使用資料庫都需要連線資料庫,代價非常高昂,因此有了資料庫連線池,每一次一個連線被建立之後不是就馬上釋放,下一次使用的時候重
第一種方法:
string str="server=.;uid=sa;pwd=111111;database=text_db";//連線字串
SqlConnection SCON = null;//連線物件
SqlCommand SCom=new SqlCommand();/
背景
最近業務上在做同城雙中心。原本的機房使用的是swarm叢集,新機房使用的是k8s叢集。業務遷移到新機房的主要工作集中在:
庫、redis、es等底層服務的遷移;
redis由原來的vip單點模式,切換為redis-cluster,由於phpredis1官方版本暫時
我們在Android應用程式開發當中經常會用到資料庫,一般在有兩種主要開發思路。
第一種:每次需要對資料庫操作的時候建立連線,操作完成後,馬上關閉連線。
這個方式一般用於不怎麼頻繁操作資料庫的情況,用完後馬上關閉達到節省系統資源的目的。
第二種:應用程式一
設定redis連線池分為如下幾步:
1. 首先在nginx.conf檔案中的http節點下新增如下upstream節點
upstream redis_pool {
server 127.0.0 1、什麼是資料庫連線池
我們現在在開發中一定都會用到資料庫,為了提高我們的系統的訪問速度,資料庫優化是一個有效的途徑。我們現在開發中使用資料庫一般都要經歷以下的四個步驟:(1)載入資料庫的驅動類,(2)建立資料庫連線,(3)進行資料操作,(4)關閉資料庫連線;在這四步中建立資料庫連線是一個比較耗時的操
連線池的基本工作原理
1、基本概念及原理
我們知道,對於共享資源,有一個很著名的設計模式:資源池(Resource Pool)。該模式正是為了解決資源的頻繁分配?釋放所造成的問題。資料庫連線池的基本思想就是為資料庫連線建立一個“緩衝池”。預先在緩衝池中放入一定數量的連
連線池的基本工作原理
1、基本概念及原理
由上面的分析可以看出,問題的根源就在於對資料庫連線資源的低效管理。我們知道,對於共享資源,有一個很著名的設計模式:資源池 (Resource Pool)。該模式正是為了解決資源的頻繁分配?釋放所造成的問題。為解決上述問
我們在連線資料庫的時候,由於建立資料庫連線代價很大(銷燬連線的代價也很大),需要消耗很多資源,因此引入資料庫連線池。資料庫連線池是一種池化技術,預先建立好資料庫連線,儲存在記憶體中,當需要連線時,從中取出即可,使用完後放回連線池。
下面我們介紹Java中常用的
最近我作了JSP資料庫的頻繁連線,在此給出資料庫連線池的必要性,對於JSP來說一個很好的J2EE伺服器是很必要的,JBOOS,WebLogic都是很好的解決方案。
一般情況下,在使用開發基於資料庫的WEB程式時,傳統的模式基本是按以下步驟:
1. 在主程式(如Serv
雖然現在名義上是PHP開發,不過做這資料分析的事,平時工作大部分用的是JAVA。C語言出身,學的語言比較多,JAVA還算熟悉,不過之前一直都沒用連線池。第一次遇到連線池是在學校的時候女朋友用連線池出現問題了,找我,我看了下覺得沒必要,直接就刪了。那時候用的是第三方擴充套件,
1 動機在專案初期對於資料庫的使用就是開啟一個連線並進行使用,使用過後關閉連線釋放資源,並且在後臺簡單測試中,並沒有出現問題。但是在與前端對接之後,發現頻繁地開啟和關閉連線會對效能造成很大的影響,而且之前假設的情況是接受的請求都是同步的,但是前端可能傳送非同步請求,當兩個請求
補充說明:
1.pooleddatasourc中包含一個poolstate物件,這個物件包含了兩個集合,idleConnections(儲存連線池中空閒的執行緒),activeConnections(儲存連線池中活動的執行緒)
2.建立新執行緒
PooledConnec
相關推薦
HttpClient連線池原理及一次連線時序圖
資料庫連線池原理及應用
HttpClient4.5.2 連線池原理及注意事項
JavaEE開發使用MySQL連線池原理及好處
JDBC連線池原理及分析
SpringBoot2.x預設連線池hikari及druid連線池
HikariCP 的Java資料庫連線池介紹及配置
物件池、資料庫連線池原理
C#(.net)中的一次連線資料庫執行多條sql語句(兩種方法)
k8s環境下由predis初始化連線緩慢引起的一次問題排查
Android多執行緒操作sqlite資料庫連線池框架的一種設計思路
Redis連線池設定及測試結果
Java資料庫連線池原理與簡易實現
Java中的資料庫連線池原理
Java中資料庫連線池原理機制的詳細講解
Java資料庫連線池比較及使用場景
j2ee資料庫連線池原理分析
PHP連線池實現的一種想法
淺析資料庫連線池原理分析與實現
mybatis連線池原理