3 回答

TA貢獻1878條經驗 獲得超4個贊
方法1:
最簡單的方法是在列電子郵件上使用唯一索引。
您不能使用首先查找電子郵件并插入電子郵件的解決方案。假設有兩個用戶 [email protected] 提交電子郵件。而且您的數據庫中沒有電子郵件。
兩個用戶都將得到 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 負責檢查唯一的電子郵件地址并引發錯誤。使用錯誤將其顯示在前端。
添加回答
舉報