0

現在、Javaを使用してデータベースに顧客を挿入しようとしています。

public void saveCustomer(Customer c)  {
    getConnection();

 try {

     CallableStatement pstmt =  con.prepareCall("{call sp_saveCustomer(?,?)}");
     pstmt.setString(1, c.getName());
     pstmt.setString(2, a.getLastName());
     pstmt.executeUpdate();

     closeConnection();
    } catch (SQLException e) {
       // Handle Exception
    }
}

ユーザーが重複レコードを挿入しようとすると、catchブロックがトリガーされます。私が心配しているのは、これがパフォーマンスのヒットを意味するのかどうかわからないということです。顧客がすでに存在するかどうかを確認するためのより良い方法ではありませんか?何かのようなもの:

public void saveCustomer(Customer c) {
    getConnection();

 boolean exists = false; 


     CallableStatement pstmt =  con.prepareCall("{call sp_checkCustomerExistence(?,?)}");
     pstmt.setString(1, c.getName());
     pstmt.setString(2, a.getLastName());
     ResultSet rs = pstmt.executeQuery();
     if (rs.next()) exists = true;
     if ( exists ){
     closeConnection(); 
     return;
     } 

     CallableStatement pstmt =  con.prepareCall("{call sp_saveCustomer(?,?)}");
     pstmt.setString(1, c.getName());
     pstmt.setString(2, a.getLastName());
     pstmt.executeUpdate();

     closeConnection();

}

最高のパフォーマンスに基づいた最良のソリューションは何でしょうか?顧客が存在するかどうかを自分で確認する必要がありますか、それとも例外をスローさせる必要がありますか?

4

3 に答える 3

1

事前のチェック=2つのデータベース呼び出しまたは2つのIOインタラクション。例外が発生する可能性があるだけで挿入しようとするのは1つだけです。例外が処理される限り、それらは必ずしも悪いことではありません。

おそらく好ましくはありませんが、リストした2つの方法の中で最速です。

于 2012-10-29T02:54:30.700 に答える
1

例外をキャッチするよりも、重複をチェックする方が望ましいと思います。sp_check_and_save_customer重複をチェックし、まだ存在しない場合は保存するプロシージャを作成できる場合は、プロシージャ自体でチェックを実行することをお勧めします。このようにして、チェックと挿入の時間差が非常に少なくなります。これは、負荷の高いアプリケーションでより重要になります。

それでも、例外処理を行ってください。また、別のプロセスがチェックと挿入の間にデータを挿入する可能性もあります。

于 2012-10-29T02:55:09.070 に答える
1
} catch (SQLException e) {

あなたSQLExceptionが捕まえていることは何を意味するかもしれません。データベーステーブルの行が重複しているために発生したとは限りません。したがって、単にそのユースケースに使用するのに十分な信頼性はありません。

適切な方法で処理するには、作成を試みる前に電話をかける必要があります。

于 2012-10-29T02:59:51.197 に答える