3 回答
TA贡献1878条经验 获得超4个赞
方法1:
最简单的方法是在列电子邮件上使用唯一索引。
您不能使用首先查找电子邮件并插入电子邮件的解决方案。假设有两个用户 some@email.com 提交电子邮件。而且您的数据库中没有电子邮件。
两个用户都将得到 false,并且您将向 DB 插入两行具有相同电子邮件的行。res.next()
如果使用唯一索引,则如果已有电子邮件,则会收到异常。您可以捕获异常并返回“重复电子邮件”消息。请参阅问题捕获重复异常
如果您使用Mysql,也许您可以使用ON DUPLICATE KEY。
方法2:有一个更复杂的解决方案。
如果不能使用唯一索引,那么可以考虑这一点。
您可以使用锁定。如果在分布式系统上工作,则应使用分布式锁。您应该锁定电子邮件。如果线程获得锁定,您可以检查是否有目标电子邮件,然后插入到数据库中。
但是,如果您的系统只在一个JVM上运行,您可以尝试:
syschronized(email.intern()) {
// check the email whether exists
// if not, insert it.
}
在这种情况下,您将遭受大型字符串池的影响,这将影响您的GC暂停并浪费内存。
实际上,您可以使用双重检查来优化性能。它看起来像
emailInDB = fetchEmailFromDB(email);
if (emailInDB == null) {
lock(email);
emailInDB = fetchEmailFromDB(email);
if(emailInDB == null) {
insertIntoDB(email)
} else {
return "the email already exists";
}
} else {
return "the email already exists";
}
TA贡献2012条经验 获得超12个赞
对于电子邮件验证
您必须将电子邮件列设置为表中的唯一列。
当您尝试插入新用户时,如果电子邮件已存在,SQL 将引发约束冲突异常。您也可以使用该错误进行错误处理
一般来说,与获得操作相比,更新将花费更多的时间,所以最好的方法是.首先,您必须检查此电子邮件ID是否存在任何行
String sql = "select email from users where email= ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "emailId");
ResultSet rs = prepStmt.executeQuery();
if (rs.next()) {
System.out.println("Row with email found");
} else {
// you can write update code here
}
TA贡献1851条经验 获得超3个赞
对于唯一电子邮件验证,有两种方法:
方法 1:第一个是执行选择查询并检查它,不建议将其作为解决方案。
PreparedStatement statement = connection.prepareStatement("select email from users where email= ?");
statement.setString(1, email99);
ResultSet resultSet = statement.executeQuery();
if (resultSet.next()) {
System.out.println("Row with email found");
} else {
// you can write update code here
}
方法 2:在数据库级别,使电子邮件列唯一。因此,每当插入新记录时。DB 负责检查唯一的电子邮件地址并引发错误。使用错误将其显示在前端。
添加回答
举报