どのように最適に使用マルチスレッド環境での発信のURLConnectionオブジェクトをクリーンアップするには?
-
18-09-2019 - |
質問
私は、サーブレットは、(それが合理的に高い同時使用を持っている)、通常のサーバー側の処理ロジックの一部として、いくつかのデータRESTスタイルを取得するために、発信のURLConnectionを作るユースケースを持っています。接続が作成され、URLが(ただし、ドメインは常に同じである)潜在的に異なっているようサーブレットが呼び出されるたびに使用されます。私はポートとの接続が、彼らは、アプリケーション・サーバー上にある必要以上に長く開放状態に保持されていませんが、該当する場合は再利用されるように、それは、できるだけ最適これを実行していることを確認します。
のJavadocは少しあいまいなようだ - URLConnectionの上:
は「特定のプロトコル仕様は、それのために異なる動作を指定しない限り要求は、このインスタンスに関連付けられたネットワークリソースを解放することができる後のURLConnectionの入力ストリーム又はのOutputStreamに近い()メソッドを呼び出す。」
HttpURLConnectionのオンます:
'はそれぞれHttpURLConnectionのインスタンスは、単一の要求を行うために使用されるが、HTTPサーバへの基本的なネットワーク接続が透過的に他のインスタンスによって共有されてもよいです。要求後のHttpURLConnectionの入力ストリーム又はのOutputStreamに近い()メソッドを呼び出すと、このインスタンスに関連付けられたネットワークリソースを解放するが、任意の共有永続的な接続には影響を与えないかもしれません。永続的な接続は、その時点でアイドル状態の場合は切断()メソッドを呼び出すと、基礎となるソケットを閉じることがあります。 '
現在、URLConnectionのが使用されているとのInputStreamは、(彼らは質問に関係ないとして削除エラー処理と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();
解決
私は、そのは、Javaの実装を使用して取得するつもりとして何を持っていることは良いことだと思います。速度が巨大な関心事であるとJavaの実装がメモリを占有されるか、遅すぎる場合は、独自の接続クラスを記述します。
他のヒント
あなたは、ApacheのHttpClientをを使用して検討するかもしれません。私たちは、文字通り、要求を送信アプリ、システムの一握りの上にバランスカップル万回日・ロードでそれを使用しています。私たちは、コールの間の接続を開いたままにしないので、私はよく分からないのHttpClientオブジェクトのプールが必要で使用しましたが、コードはここに私の時間に先行し、多分彼らはその理由を見つけます。