5

JDBC(mysqlデータベース)を使用してJavaプログラムを作成します。mysqlの整合性に違反すると(同じ主キー値を挿入しようとすると)、SQL例外が発生します。 決して起こらない方法でそれを書くべきですか(最初にブール関数が主キー値がまだDBにないかどうかをチェックし、次に挿入を呼び出します)、または例外によってそれを処理しても大丈夫ですか?例 :

catch (SQLException ex) {ex.printStackTrace(); showSomeErrorDialog(); }
4

3 に答える 3

4

これを実現するには、基本的に2つの方法があります。

  1. 同じトランザクション内に--を挿入する前に、レコードが存在するかどうかをテストします。

  2. SQLException#getSQLState()キャッチされたSQLException開始点のうち、 SQL仕様23に従って制約違反であるかどうかを判別します。つまり、制約違反の「単なる」よりも多くの要因によって引き起こされる可能性があります。制約違反としてすべてを修正するべきではありません。SQLException

    public static boolean isConstraintViolation(SQLException e) {
        return e.getSQLState().startsWith("23");
    }
    

意味的に正しいので、最初のものを選びます。実際、それは例外的な状況ではありません。つまり、それが起こる可能性があることを知っています。ただし、トランザクションが同期されていない(知らないうちに、またはパフォーマンスを最適化するために)重い並行環境では失敗する可能性があります。次に、代わりに例外を判別することをお勧めします。

そうは言っても、通常、主キーで制約違反が発生することはありません。主キーとしてテクニカルキーを使用する適切に設計されたデータモデルでは、通常、データベース自体によって管理されます。フィールドは一意のキーであると想定されていませんか?

于 2010-02-04T16:37:16.743 に答える
2

2つの可能な答えがあります:

  • アプリケーションがこの種の動作を回避するように設計されていることがわかっている場合は、例外を使用してください
  • アプリケーションでこれらのエラーが頻繁に発生する可能性がある場合は、テストを使用してください。
于 2010-02-04T16:10:49.050 に答える
1

他の人が2つの可能なアプローチがあると述べたように、1つはテストしてから挿入/更新するか、そうでなければSQL例外を処理することです。これらのアプローチには両方とも欠点があります。

  • 「挿入前のテスト」の警告は、すべてのトランザクションにパフォーマンスに影響を与える追加のクエリがあることです。このような誤ったトランザクションの数が少ない場合、これは特に大きな問題になります。
  • 「SQL例外の評価」の警告は、そのような例外メッセージが非常にデータベース固有であるということです。これらのメッセージは、ほとんどの場合、制約違反があることを示す以外に特定の情報を提供しません。

そこで、 2つのハイブリッドのアプローチを提案します。

  • 挿入する前にテストを実行しないでください。
  • データベースに例外をスローさせます。
  • SQL例外をキャッチします。
  • 例外フロー(キャッチブロック)で、追加のクエリを実行して、非常に具体的なエラーメッセージを作成し、正確に失敗したもの(一意キー、主キー、外部キー、特定の列など)を顧客に示します。

これには数行の追加コードが必要になる場合がありますが、パフォーマンスが確実に向上し、わかりやすいエラーメッセージが生成されます。

于 2016-02-02T08:52:26.937 に答える