2

Java アプリケーションのプロファイリングを行っているところ、jdbc PreparedStatement 呼び出しに関する興味深い統計が見つかりました。

以下に環境の詳細を示します。 データベース: Sybase SQL Anywhere 10.0.1 ドライバー: com.sybase.jdbc3.jdbc.SybDriver 接続プール: c3p0 JRE: 1.6.0_05

問題のコードを以下に示します。

try {
    ps = conn.prepareStatement(sql);
    ps.setDouble(...);
    rs = ps.executeQuery();
              ......

    return xyz;
}
finally {
    try {
        if (rs != null) rs.close();
        if (ps != null) ps.close();
    }
    catch (SQLException sqlEx) {

    }
}

JProfiler 統計から、この特定の resultspace.close() ステートメントだけでかなりの時間がかかることがわかりました。25ミリ秒から320秒まで変化しますが、本質的に同一の他のコードブロックの場合、これには20マイクロ秒近くかかることがわかります。

念のため、このパフォーマンス テストを複数回実行し、このデータを確認しました。私はこの行動に困惑しています - 考えていますか?

4

4 に答える 4

3

このパフォーマンスは JDBC ドライバー固有です。C3P0 接続プールはそれに影響を与えるべきではありません。新しい JDBC ドライバーまたは別の JDBC ドライバーで再テストすることをお勧めします。Sybase ドライバーの代替は、jTDS ドライバーです。これが Sybase ドライバーと比較してどのように機能するかはわかりませんが、Microsoft 独自の MSSQL JDBC ドライバーと比較して非常にパフォーマンスが高いことが知られています。

実際の問題とは関係ありませんが、実際にはclose()メソッドをそれぞれ独自のブロックで呼び出す必要があります。そうしないと、すべてが閉じられるtryという保証はありません。最初の close が をスローした場合、後続の close 呼び出しは実行されません。Apache Commons DbUtilsは、ボイラープレート コードを取り除くのに役立つ場合があります。SQLException

于 2010-03-23T21:15:30.990 に答える
1

やや関連するメモとして、Apache Commons DbUtilsDbutils.closeQuietly()メソッドを調べて、正しい例外処理を使用して正しい順序で接続/ステートメント/結果セットを閉じることを簡単に管理できます。

于 2010-03-23T22:22:46.667 に答える
0

ステートメントが選択であり、すべてのデータを消費していない場合は、ステートメントを閉じる前にキャンセルしてみてください。

于 2010-03-24T15:00:36.973 に答える
0

遅延中にメソッド呼び出しが実際に CPU 負荷を引き起こしているのか、それとも単に待機しているだけなのか? ResultSet を閉じるには、データベースとのリモート通信が必要になる可能性が高く、これには時間がかかる場合があると思います。

于 2010-03-23T21:08:20.043 に答える