0

完了するまでに 3 時間かかるクエリがあります。これは以前は問題ではありませんでした。以前は、このクエリを呼び出すコードが weblogic にデプロイされ、後者の独自の接続プール マネージャーを使用していました。

このプロセスは大量のメモリを占有するため、このコードを取り出して独自のヒープ スペースで実行するようにしました。クエリを呼び出すリクエストは、jms を介して行われます。また、使用している接続プール マネージャーが、デフォルト設定 (最大接続数 = 8、最小接続数 = 0) を使用する dbcp であることにも気付きました。jms クライアントはマルチスレッドです。

インターフェイス (TOAD) を介してクエリを実行すると、2 秒しかかからないので、ここからはデータベースを「非難」することを除外しました。

ボトルネックを見つけるために、ここからどのような手順を踏めばよいか考えていました。多分接続プールで何か?

4

2 に答える 2

3

VisualVM やスレッド ダンプなどのツールを使用して、スレッドが何を行っているかを確認する必要があります。何らかの IO 操作が完了するのを待っているだけですか? 同期が不十分なコードが必要以上に長く待機していませんか? 3 時間 (または 3 時間) のタイムアウト後に停止するデッドロックでさえあるでしょうか?

于 2010-12-22T19:33:45.537 に答える
1

自由に使える最も基本的な Java パフォーマンス ツールであるスレッド ダンプに戻ることは常に価値があると思います。スレッド ダンプを取得するには、さまざまな方法があります。

  • コンソールをお持ちの場合は、ctrl-break (win) または ctrl-\ (*nix) を使用してください
  • jstack
  • jconsole およびスレッド タブまたは使用可能な mbeans がダンプを引き起こす

あなたのプログラムが何をしているかを見てください。これらを定期的に服用してください。Thread Dump AnalyzerSamuraiなど、大きなスレッド ダンプを調べるのに役立つツールがあります。

jconsole または Visual VM を使用してこれをインタラクティブに確認することもできますが、未加工のダンプを読み取る十分に発達した才能が役立つと思います。

于 2010-12-22T19:39:04.777 に答える