2

サーブレット(同時使用率がかなり高い)が発信URLConnectionを作成して、通常のサーバー側処理ロジックの一部としてデータRESTスタイルを取得するユースケースがあります。URLは潜在的に異なるため、サーブレットが呼び出されるたびに接続が作成されて使用されます(ただし、ドメインは常に同じです)。ポートと接続がアプリケーションサーバー上で必要な時間より長く開いたままにならないように、これが可能な限り最適に行われるようにしたいのですが、該当する場合は再利用されます。

Javadocは少し曖昧に見えます-URLConnectionについて:

「リクエスト後にURLConnectionのInputStreamまたはOutputStreamでclose()メソッドを呼び出すと、特定のプロトコル仕様で異なる動作が指定されていない限り、このインスタンスに関連付けられたネットワークリソースが解放される可能性があります。」

HttpURLConnectionの場合:

'各HttpURLConnectionインスタンスは単一のリクエストを行うために使用されますが、HTTPサーバーへの基盤となるネットワーク接続は他のインスタンスによって透過的に共有される場合があります。リクエスト後にHttpURLConnectionのInputStreamまたはOutputStreamでclose()メソッドを呼び出すと、このインスタンスに関連付けられているネットワークリソースが解放される場合がありますが、共有の永続的な接続には影響しません。その時点で持続的接続がアイドル状態である場合、disconnect()メソッドを呼び出すと、基になるソケットが閉じる可能性があります。

現在、URLConnectionが使用されており、以下のコードに従って入力ストリームのみが閉じられています(エラー処理とURL読み取りは、質問に関連しないため削除されました)。私の考えでは、これによりストリームリソースがクリーンアップされますが、可能であれば基盤となるソケットの再利用が可能になります(リクエストは常に同じドメインに送信され、URLパスが異なるため)。さらに最適化する方法についてのアドバイスをいただければ幸いです。

URL requestUrl = new URL(location);
URLConnection urlConnection = requestUrl.openConnection();
BufferedReader br = new BufferedReader(new InputStreamReader(urlConnection.getInputStream(), "UTF-8"));
//reading code here
  br.close();
4

2 に答える 2

5

ApacheのHttpClientの使用を検討してください。リクエストを送信するアプリで使用します。文字通り、1日に数百万回負荷分散された少数のシステムで使用されます。HttpClientオブジェクトのプールを使用しました。これは、呼び出し間の接続を開いたままにしないため、必要かどうかはわかりませんが、コードはここでの私の時間よりも前のものであり、おそらく彼らはその理由を見つけました。

于 2009-08-17T21:23:25.923 に答える
1

あなたが持っているものは、Javaの実装を使用するのと同じくらい良いと思います。速度が大きな懸念事項であり、Javaの実装がメモリを占有している、または遅すぎる場合は、独自の接続クラスを作成してください。

于 2009-08-17T19:20:36.030 に答える