7

Oracleによると setNetworkTimeout が解決するはずの正確な問題に遭遇しました。クエリが socket.read() で数分間スタックしました。

しかし、このメソッドの最初のパラメーターが何である必要があるかはほとんどわかりません。null を送信すると、AbstractMethodError 例外が発生するため、ネットワーク タイムアウトを設定するためだけに実装に何らかのスレッド プールが実際に必要なのでしょうか?

この1つの条件のためだけにスレッドプールを実行せずに同じ効果を達成する方法はありますか?

4

2 に答える 2

13

ドキュメンテーションはこれを恐ろしく説明しているようですが、クラスの背後にあるコードを見なければ、Executor インスタンスをメソッドに渡して、実装がジョブ/スレッドを生成してステータスを確認できるようにする必要があると思います。接続。

接続の読み取りはブロックされるため、あらゆる種類のタイムアウト ロジックを実装するには、接続のステータスをチェックできる読み取りスレッド以外の別のスレッドが必要です。

JDBC ドライバーが内部でロジックを実装する代わりに、これを処理するためにスレッドを生成する方法/タイミングの設計上の決定が行われたようです。タイムアウト。このようにして、クライアントとして、チェックの実行頻度などを制御したり、コンテナー内に必要以上のスレッドが生成されないようにしたりすることができます。

Executor インスタンスがまだない場合は、デフォルトのインスタンスを作成できます。

conn.setNetworkTimeout(Executors.newFixedThreadPool(numThreads), yourTimeout);
于 2012-05-18T15:43:22.997 に答える