2011-08-06 9 views
0

SSLを使用してRESTful APIと通信しようとしています。クライアントアプリケーション全体は、次のような基本的な接続方法に依存します。JavaクライアントでHTTPS接続を最適化する

URL url = null; 
     HttpsURLConnection connection = null; 
     BufferedReader bufferedReader = null; 
     InputStream is = null; 

     try { 
       url = new URL(TARGET_URL); 

       HostnameVerifier hv = new HostnameVerifier() { 
        public boolean verify(String urlHostName, SSLSession session) { 
         return true; 
        } 
       }; 

       HttpsURLConnection.setDefaultHostnameVerifier(hv); 
       connection = (HttpsURLConnection) url.openConnection(); 

       connection.setRequestMethod(requestType); 
       connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); 
       connection.setRequestProperty("Content-Language", "en-US"); 
       connection.setSSLSocketFactory(sslSocketFactory); 

       is = connection.getInputStream(); 

       bufferedReader = new BufferedReader(new InputStreamReader(is)); 
       String line; 
       StringBuffer lines = new StringBuffer(); 

       while ((line = bufferedReader.readLine()) != null) { 
        lines.append(line).append(LINE_BREAKER); 
       } 
       return lines.toString(); 
     } catch (Exception e) { 
      System.out.println("Exception is :"+e.toString()); 
      return e.toString(); 
     } 
    } 

これはうまくいきますが、より効率的な方法がありますか?私たちはApache HTTPClientを試しました。それはすごくシンプルなAPIを持っていますが、上記のコードとApache HTTPClientのパフォーマンスをYourKitと比較すると、後者は最初のものより多くのオブジェクトを作成していました。これをどのように最適化するのですか?

+1

これは面白そう、しかし、あなたが特定の問題を抱えている場合には言及していません。 HTTPClient経由で生成されるオブジェクトの数が実際のパフォーマンスの問題を引き起こしていますか?またはあなたは[事前に最適化していますか?](http://en.wikipedia.org/wiki/Program_optimization#When_to_optimize)? – OverZealous

+0

実際の問題は、生成されるオブジェクトの数が多すぎます。これにより、サーバーが消費するメモリが増加し、メモリがMAX_HEAP_SPACEに達するとGCがアクティブになります。このGCがアクティブになると、いつかCPU使用率も増加します。だから、生成されるオブジェクトの数を減らすことができれば、CPUを冷やしたり、サーバーを冷たく保つのに役立ちます。 – Nikhil

答えて

2

私はHTTPClientを使用しましたが(HTTPSでは使用しませんでしたが)、これはあなたのケースに当てはまると思います。お勧めは、サーバー用の単一のHTTPクライアントと、呼び出しごとに新しいHTTPGetオブジェクトを作成することです。 HTTPクライアントを初期化するときに、ホストごとに割り当てる適切な数の接続と、最大接続数でマルチスレッドクライアント接続マネージャを指定したいと思うでしょう。

+0

ありがとう!それは有望なようだ!私たちの唯一の関心事は、接続オブジェクトを安全に共有できるかどうかということでした。しかし、あなたが言ったように、HTTPGetオブジェクトは呼び出しごとにインスタンス化する必要があります。すぐに試してやり直します:) – Nikhil

+0

HTTPClientオブジェクトはスレッド間で自由に共有できますが、個々のメソッドは自由に共有できません。 –

+0

'PoolingClientConnectionManager'で初期化された静的な' HttpClient'と、新しいHttpGet'や 'HttpPost'を使用すると、多くの助けになりました。ありがとう! – Nikhil

1

HttpClientの代わりにHttpCoreを使用することもできます。 HttpCoreは、HTTPトランスポートコンポーネントのセットで、HttpClientに基づいています。パフォーマンスはもちろんのこと、メモリの占有面積が小さくなるように最適化されています。 HttpClient(接続管理、クッキー&状態管理、認証)によって提供されるより高いレベルのHTTP機能が欠けていますが、メモリ使用率に関して非常に効率的でなければなりません。

http://hc.apache.org/httpcomponents-core-ga/examples.html

+0

KevinはHTTPClientについて上記のように書いています。「お使いのサーバー用に単一のHTTPClientを作成し、呼び出しごとに新しいHTTPGetオブジェクトを作成することをお勧めします。 HTTPSを使用したHttpCoreの場合、どうすれば同様のことが達成できますか? – mxro

関連する問題