【问题标题】:Best Practice for handling duplicate INSERT statements处理重复 INSERT 语句的最佳实践
【发布时间】:2012-10-18 09:26:57
【问题描述】:

我目前正在使用 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();

}

基于最佳性能的最佳解决方案是什么?如果客户存在,我应该检查自己还是应该抛出异常?

【问题讨论】:

    标签: java sql database sql-server-2008 exception


    【解决方案1】:

    我认为检查重复项比捕获异常更可取。 唯一的建议是,如果您可以创建一个作为sp_check_and_save_customer 的程序来检查您的程序本身如果它不存在,则复制并保存。这样,检查和插入之间的时间差就会非常小,这在负载较重的应用程序中变得更加重要。

    不过,请同时处理您的异常,因为仍有可能另一个进程在检查和插入之间插入数据。

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:
        } catch (SQLException e) {
        

        您所捕获的SQLException 可能意味着任何事情。这并不一定意味着它是由于数据库表中的重复行而发生的。因此,只是它不够可靠,无法用于该用例。

        您只需在尝试创建之前拨打电话,以适当的方式处理它。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2019-03-08
          • 2013-09-06
          • 2011-04-10
          • 1970-01-01
          • 2012-03-17
          • 2013-08-25
          • 1970-01-01
          相关资源
          最近更新 更多