奇妙な動作が見られます。これ以上の洞察を得る方法がわかりません。誰かが助けてくれることを願っています。
背景: 結果を返すのに時間がかかるクエリがあるため、ユーザーが要求に応じて直接データを待機させるのではなく、定期的に Timer オブジェクトを介してこのクエリを実行し、結果を静的変数に格納します。したがって、ユーザーがデータを要求すると、常に静的変数からプルするだけなので、応答は事実上瞬時になります。ここまでは順調ですね。
問題: ただし、バックグラウンド (タイマー) 要求がデータのクエリを開始したときにデータの要求を行うと、ユーザーの要求は応答する前にデータが返されるのを待ちます --ユーザーを待たせる。あたかも tomcat がスレッドと同期して動作しているかのようです (そうではないことはわかっています。そのように見えるだけです)。
これは本番環境であり、ほとんどの場合、すべてがうまく機能しますが、ユーザーにとっては、サイトがハングするだけで、信頼できないと感じることがあります (まあ、ある意味ではそうです)。
私がやったこと:データのリクエストが静的メソッドにあったので、「ああ!スレッドが同期されているため、遅延が発生している!」と思いました。そのため、すべての静的メソッドを引き出し、同期を削除し、各呼び出しでデータを取得するために独自のオブジェクトをインスタンス化するように強制しました (スレッドセーフに保つため)。セマフォでの静的変数への同期もありません。
また、javamelody をインストールして、何が起こっているのかについての洞察を得ようとしましたが、これまでのところ新しいことは何もありません。多くの (大部分の) スレッドが「WAITING」状態にあることに気付きましたが、ユーザー時間と CPU 時間も 0 ミリ秒になっているため、何かを指しているとは思わないでください (?)。
Tomcat 5.5 (Apache レイヤーなし)、struts 2、Java 1.5 の実行
静的変数への単純なリクエストが長いバックグラウンド プロセスでハングする理由を誰かが知っている場合は、本当に感謝します! または、私が洞察を得る方法を知っていれば、それも素晴らしいでしょう.
ありがとう!