我目前正在使用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();
}
基于最佳性能的最佳解决方案是什么?我应该检查自己是否存在客户,还是应该抛出异常?
答案 0 :(得分:1)
在hand之前检查=两次数据库调用或两次IO交互。尝试插入可能发生异常的异常只是一个。只要处理异常,它们就不一定是坏事。
虽然可能不是首选,但它是您列出的两种方法中最快的。
答案 1 :(得分:1)
我认为检查副本比捕获异常要好。只有建议我可以在程序中执行检查,如果你可以创建一个sp_check_and_save_customer
的程序检查重复并保存(如果它尚不存在)。这样,检查和插入之间的时间差异将非常小,这在重载应用程序中变得更加重要。
仍然请进行异常处理,因为另一个进程仍然可能在检查和插入之间插入数据。
答案 2 :(得分:1)
} catch (SQLException e) {
你所捕获的SQLException
可能意味着什么。它并不一定意味着它因数据库表中的重复行而发生。因此,简单地说它不够可靠,无法用于该用例。
你必须在尝试创建一个之前打个电话,以正确的方式处理它。