なぜあなたは、http接続プールを使用する必要があります
1、遅延削減:接続プールを使用していない場合は、HTTP要求は(スリーウェイハンドシェイクを介して)TCPコネクションを再確立するとき、すべての接続が開始され、使用済み閉じ接続(4揺れ)を、接続プールが低減されている場合このパートタイムのロスは、過小評価しないいくつかの握手を行い、私がテストされ、実質的に3倍の時間遅延を発見されています
2、より高い同時実行のためのサポート:あなたは、接続プーリングを使用しない場合は、すべての接続は、それが不可能な新しい接続を確立すること、ポートシステムリソースがすぐに大規模な同時の場合に排出され、ポートを開きます。
接続プールの例
接続プールマネージャコード
輸入org.apache.http.config.Registry; 輸入org.apache.http.config.RegistryBuilder。 輸入org.apache.http.conn.socket.ConnectionSocketFactory。 輸入org.apache.http.conn.socket.LayeredConnectionSocketFactory。 輸入org.apache.http.conn.socket.PlainConnectionSocketFactory。 輸入org.apache.http.conn.ssl.SSLConnectionSocketFactory。 輸入org.apache.http.impl.client.CloseableHttpClient; 輸入org.apache.http.impl.client.HttpClients。 輸入org.apache.http.impl.conn.PoolingHttpClientConnectionManager; 輸入javax.annotation.PostConstruct; 輸入javax.net.ssl.SSLContext; 輸入java.security.NoSuchAlgorithmException。 パブリック クラスHttpConnectionManager { PoolingHttpClientConnectionManagerセンチ = nullを。 @PostConstruct 公共 空のinit(){ LayeredConnectionSocketFactory sslsf = nullを。 してみてください{ sslsf = 新しいSSLConnectionSocketFactory(SSLContext.getDefault()); } キャッチ(持つNoSuchAlgorithmException電子){ e.printStackTrace(); } レジストリ <ConnectionSocketFactory> socketFactoryRegistry = RegistryBuilder。<ConnectionSocketFactory> ()を作成します .register( "HTTPS" 、sslsf) .register( "HTTP"、新PlainConnectionSocketFactory()) .build()。 CM = 新しいPoolingHttpClientConnectionManager(socketFactoryRegistry)。 cm.setMaxTotal( 200 )。 cm.setDefaultMaxPerRoute( 20 )。 } 公共CloseableHttpClient getHttpClient(){ CloseableHttpClientのHttpClient = HttpClients.custom() .setConnectionManagerさ(cm) .build()。 / * CloseableHttpClient HttpClientをHttpClients.createDefault =(); //接続プールが接続得るためにこのように使用されていない場合* / リターンのHttpClient。 } }
使用接続プーリングコード
プライベート 静的CloseableHttpClient getHttpClient(){ HttpConnectionManager httpConnectionManager =(HttpConnectionManager)AppBeanUtil.getBean( "httpConnectionManager" )。 返す httpConnectionManager.getHttpClientを(); }
接続しなさい
公共の 静的な文字列getFromUrl(文字列のURL、地図<文字列、文字列>のparams、String型の文字セット)がスロー例外{ 場合(StringUtil.isEmpty(文字セットを)){ 文字セット = defaultCharset。 } CloseableHttpClientのHTTPClient = getHttpClient()。 URIBuilder uriBuilder = 新しいURIBuilder(URL); uriBuilder.setCharset(Charset.forName(文字セット))。 もし(のparams!= nullの){ 反復子の<string> keyIt = params.keySet()反復子()。 一方、(keyIt.hasNext()){ 文字列キー = keyIt.next()。 ストリングヴァル = params.get(キー)。 uriBuilder.setParameter(キー、val)で、 } } URI URI = uriBuilder.build()。 HTTPGET HTTPGET = 新しいHTTPGET(URI)。 CloseableHttpResponse応答 = httpclient.execute(HTTPGET)。 してみてください{ HttpEntityエンティティ = response.getEntity()。 もし(エンティティ!= nullの){ 文字列の内容 = のgetContent(entity.getContent())。 戻り値の内容; } } 最後に{ )(response.close。 } リターン ヌル。 }
アクセス内容を取得するURL
プライベート 静的文字列のgetContent(入力ストリームインストリーム)は、スローIOExceptionが{ StringWriterライター = 新しいにStringWriter(); IOUtils.copy(インストリーム、作家、defaultCharset)。 instream.close(); リターンwriter.toString(); }
必要なインストリームが閉じてデータの読み出し、。
効率試験を接続プーリングを使用して、接続プールをテストしていません。
@Test 公共 ボイド事後テスト()がスロー例外{ 長い =開始)(のSystem.currentTimeMillis。 以下のために(INT ; I <200; iが0 = I ++ ){ 文字列の内容 = HttpClientPoolUtil.postFromUrl( "https://www.cnblogs.com/kingszelda/p/8988505.html"、新たな HashMapの<> ()); } System.err.println(「---------------------------事後--------------- ------------」); System.err.println(のSystem.currentTimeMillis() - 開始)。 System.err.println(「---------------------------事後--------------- ------------」); 開始 = のSystem.currentTimeMillis(); 以下のために(INT ; I <200; iが0 = I ++ ){ 文字列の内容 = HttpClientUtil.postFromUrl( "https://www.cnblogs.com/kingszelda/p/8988505.html"、新たな HashMapの<> ()); } System.err.println(のSystem.currentTimeMillis() - 開始)。 }
テスト結果
---------------------------事後---------------------- -----
9791
---------------------------事後---------------- -----------
39427
それは39.4秒、30秒の時間差を接続プーリングを使用せずに9.7秒の200の支出時間へのアクセスを接続プーリングの使用で見ることができます。
送信要求と受信から計算要求により各時間150ミリ秒かかる接続を確立するために約48ミリ秒を要し、非常に接続可視消費性能を作成する必要があることです。