2

私のプログラムは、Oracle クエリのパフォーマンスに問題があります。SQLPlus ではすぐに返されるため、SQL のパフォーマンスは良いと思います。

しかし、私のプログラムが 1 週間のように長時間実行されると、SQL クエリ (JDBC を使用) が遅くなります (私のログでは、最初にプログラムを開始したときよりもクエリ時間が大幅に長くなります)。プログラムを再起動すると、クエリのパフォーマンスが正常に戻ります。

私が使用しているSQLはプレースホルダー「?」を使用していないため、preparedStatementの使用方法に何か問題がある可能性があると思います。まったく。複雑な選択クエリです。

クエリ プロセスは、util クラスによって実行されます。クエリを作成する関連コードは次のとおりです。

public List<String[]> query(String sql, String[] args) {
    Connection conn = null;
    conn = openConnection();
    conn.setAutocommit(true);
    ....
    PreparedStatement preStatm = null;
    ResultSet rs = null;
    ....//set preparedstatment arg code 
    rs = preStatm.executeQuery();
      ....
    finally{
           //close rs
           //close prestatm
           //close connection
     }
 }

私の場合、args は常に null なので、クエリ sql をこのクエリ メソッドに渡すだけです。プログラムを長時間実行した後、この方法で DB クエリが遅くなる可能性はありますか? または、代わりにステートメントを使用するか、「?」で引数を渡す必要があります。SQLで?問題の根本原因を見つけるにはどうすればよいですか? ありがとう。

4

2 に答える 2

1

jdbc キャッシュに問題がある可能性があります... oracle の仕様 オフにしてみてください。または、ドライバーを数回 (1 日に 1 回) 再初期化してみてください。

于 2012-06-15T22:28:09.447 に答える
0

最初に、最も時間を費やしている場所を確認するのに役立つデータを調べる必要があります。パフォーマンス チューニングの場合、推測はオプションではありません。

そのため、問題を提示しているレイヤー (JAVA または DB) を特定する確かなデータを取得することをお勧めします。

このため、問題が最も顕著になったときに AWR および ASH レポートを確認することをお勧めします。また、JVM でデータを収集します (JConsole および/または JVisualVM を使用できます)。

悪いパフォーマンスを最初に診断するときは、常に「USE」メソッド、使用率、飽和、およびエラーを行います。

まず、ログでエラーを探します。

次に、飽和状態になっているリソース (CPU、メモリなど) を探します。

最後に、各リソースの使用率を確認します。クライアント サーバー レイアウトを使用すると、これが簡単になります。そうでない場合は、プロセス レベルにドリルダウンして、Java と DB のどちらであるかを確認する必要があります。

このデータを収集したら、それに応じてチューニング作業を指示できます。このアプローチを行っても、時間を無駄にするだけでなく、問題を隠したり、新しい問題を引き起こしたりすることさえあります。

このデータを後で戻ってきて、私たちが見てみましょう!

于 2014-07-11T21:39:17.197 に答える