4

永続的な接続のための Java HTTP 接続プールについては、 http://download.oracle.com/javase/6/docs/technotes/guides/net/http-keepalive.htmlで説明されています。ただし、接続が再利用されない場合にキャッシュから削除されるかどうか、およびその場合のタイムアウトの長さは示されません。

私が見つけたこれへの唯一の参照は、 http://www.java.net/forum/topic/performance/general-performance-discussion/reusing-socket-connections-httpurlconnection-0からの次のコメントでした:

「キープアライブソケットはタイムアウトの影響を受けます。サーバーが HTTP ヘッダーでタイムアウトを送り返す場合、そのタイムアウト値が使用されます。それ以外の場合、タイムアウトはわずか 5 秒であり、その後ソケットは再利用されません [.. .] 残念ながら、タイムアウトを設定することはできません。これは、実装の内部でハードウェア化されています。"

もし本当なら、これは私たちが目にしているいくつかの奇妙な動作を説明するものであり、私はこれを確認するように思われる小さなテストケースを書きました. (Windows では Java 1.6.20 を使用します。)

これに関するドキュメントを知っている人はいますか?また、コメントは数年前のものです。タイムアウトはまだハードコーディングされていますか、それとも設定できますか?

4

1 に答える 1

1

それはかなり論理的に聞こえます。ネットワーク プロパティ (メイン API で設定できるもの以外) のドキュメントは、こちらです。AFAICT 設定できる唯一のことは、キープアライブを使用するかどうかと、プールする接続の数です。

Java 7 では、起動時のみチェックされるようです。Java 6のドキュメントにはその影響についてのメモはありませんが、それはドキュメントの見落としであるに違いないと思います。したがって、原則として、キープアライブをオフにするには、コマンドラインで次のように渡す必要があります。

java -Dhttp.keepalive=false ...

または、ホストごとのプールを小さくするには:

java -Dhttp.maxConnections=1 ...

で試すこともできますSystem.setProperty()が、おそらくうまくいきません。

これがどのような問題を引き起こすのかを知ることは興味深いでしょう。おそらくどこかに解決策が見つかるでしょうか?

于 2011-02-16T17:45:39.667 に答える