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

事先检查 = 两次数据库调用或两次 IO 交互。尝试仅插入可能发生异常的异常只是其中之一。只要处理了异常,它们不一定是坏事。

虽然可能不是首选,但这将是您列出的两种方法中最快的。

于 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 回答