0

奇妙な動作が見られます。これ以上の洞察を得る方法がわかりません。誰かが助けてくれることを願っています。

背景: 結果を返すのに時間がかかるクエリがあるため、ユーザーが要求に応じて直接データを待機させるのではなく、定期的に Timer オブジェクトを介してこのクエリを実行し、結果を静的変数に格納します。したがって、ユーザーがデータを要求すると、常に静的変数からプルするだけなので、応答は事実上瞬時になります。ここまでは順調ですね。

問題: ただし、バックグラウンド (タイマー) 要求がデータのクエリを開始したときにデータの要求を行うと、ユーザーの要求は応答する前にデータが返されるのを待ちます --ユーザーを待たせる。あたかも tomcat がスレッドと同期して動作しているかのようです (そうではないことはわかっています。そのように見えるだけです)。

これは本番環境であり、ほとんどの場合、すべてがうまく機能しますが、ユーザーにとっては、サイトがハングするだけで、信頼できないと感じることがあります (まあ、ある意味ではそうです)。

私がやったこと:データのリクエストが静的メソッドにあったので、「ああ!スレッドが同期されているため、遅延が発生している!」と思いました。そのため、すべての静的メソッドを引き出し、同期を削除し、各呼び出しでデータを取得するために独自のオブジェクトをインスタンス化するように強制しました (スレッドセーフに保つため)。セマフォでの静的変数への同期もありません。

また、javamelody をインストールして、何が起こっているのかについての洞察を得ようとしましたが、これまでのところ新しいことは何もありません。多くの (大部分の) スレッドが「WAITING」状態にあることに気付きましたが、ユーザー時間と CPU 時間も 0 ミリ秒になっているため、何かを指しているとは思わないでください (?)。

Tomcat 5.5 (Apache レイヤーなし)、struts 2、Java 1.5 の実行

静的変数への単純なリクエストが長いバックグラウンド プロセスでハングする理由を誰かが知っている場合は、本当に感謝します! または、私が洞察を得る方法を知っていれば、それも素晴らしいでしょう.

ありがとう!

4

2 に答える 2

0

1 つの考えられる説明は、実行時間の長いクエリによって引き起こされたデータベース ロック (または何か) が原因で、スレッドが実際にデータベース レベルでブロックされていることです。

何が起こっているのかを把握する方法は、ブロックされたスレッドがブロックしている場所を正確に見つけることです。スレッド ダンプは、SIGQUIT (または同等のもの) を JVM に送信することで生成でき、すべての Java スレッド スタックのスタック トレースが含まれます。または、デバッガーなどを接続することで、同じ情報 (およびそれ以上) を取得できます。いずれにせよ、各スタックのトップ フレームのクラス名と行番号により、ソース コードを見て、(少なくとも) どのようなロックまたはブロッキングが行われているかを把握できるはずです。

于 2012-09-01T00:15:34.540 に答える
0

知りたい人のために、私は最終的に VisualVM ( http://visualvm.java.net/download.html ) を見つけました。パーフェクトだ。いつものようにEclipseからTomcatを実行すると、VisualVMクライアント内に表示されます。tomcat アイコンを右クリックし、[スレッド ダンプ] を選択します。

正しい方向への助けと指針をありがとう!

于 2012-09-06T02:13:51.890 に答える