Mysql 不捕获SQL异常的安全性
假设我有一个程序,它将电子邮件地址放入数据库,其中电子邮件属性是主键。 如果我有一个重复的电子邮件地址,我可以用两种方式处理它 1) 运行“从表中选择电子邮件”查询。如果电子邮件当前在那里,不要添加它Mysql 不捕获SQL异常的安全性,mysql,sql,jdbc,exception-handling,sqlexception,Mysql,Sql,Jdbc,Exception Handling,Sqlexception,假设我有一个程序,它将电子邮件地址放入数据库,其中电子邮件属性是主键。 如果我有一个重复的电子邮件地址,我可以用两种方式处理它 1) 运行“从表中选择电子邮件”查询。如果电子邮件当前在那里,不要添加它 2) 不要检查表中是否有电子邮件。catch(SQLException e),但不打印堆栈跟踪,只需跳过它即可。这样,如果我插入一个副本,它实际上会忽略它 对于方法1,我只执行一个简单的select查询(没有连接或任何花哨的东西),所以性能并不是什么大问题。但是,如果我想优化性能,方法2是一种可行
2) 不要检查表中是否有电子邮件。catch(SQLException e),但不打印堆栈跟踪,只需跳过它即可。这样,如果我插入一个副本,它实际上会忽略它 对于方法1,我只执行一个简单的select查询(没有连接或任何花哨的东西),所以性能并不是什么大问题。但是,如果我想优化性能,方法2是一种可行、安全的方法吗? 因此,我不再每次都运行“选择…”,而是添加它 跳过异常是否存在任何安全问题 Java示例(使用JDBC):
在mysql中,您可以执行
INSERT IGNORE
,如果违反了唯一约束,则不会插入行。如果您非常关心性能,我建议您首先停止使用电子邮件地址作为主键。在我看来,把电子邮件地址作为主键是荒谬的。
try {
String sql = "insert into emails values(?)";
PreparedStatement pstmt = conn.prepareStatement(sql);
pstmt.setString(1, email);
pstmt.execute();
return true;
}
catch(SQLException e) {
// e.printStackTrace(); // skip; don't print out error
return false;
}