处理重复INSERT语句的最佳实践

时间:2012-10-29 02:47:18

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

我目前正在使用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
    }
}

当用户尝试INSERT重复记录时,将触发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();

}

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

3 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我认为检查副本比捕获异常要好。只有建议我可以在程序中执行检查,如果你可以创建一个sp_check_and_save_customer的程序检查重复并保存(如果它尚不存在)。这样,检查和插入之间的时间差异将非常小,这在重载应用程序中变得更加重要。

仍然请进行异常处理,因为另一个进程仍然可能在检查和插入之间插入数据。

答案 2 :(得分:1)

} catch (SQLException e) {

你所捕获的SQLException可能意味着什么。它并不一定意味着它因数据库表中的重复行而发生。因此,简单地说它不够可靠,无法用于该用例。

你必须在尝试创建一个之前打个电话,以正确的方式处理它。