在我的Spring Rest应用程序中,我创建了一种注册新用户的方法。里面有电子邮件重复检查,以确认电子邮件已经注册。如果是这样,它将以其他方式返回错误消息,新用户将注册。
当我尝试使用100个用户的jmeter测试代码时,有时重复检查会被跳过。并插入2个具有相同电子邮件ID的用户。我正在使用当前系统毫秒创建电子邮件ID。
请有人帮忙为什么会这样。
最佳答案
这是线程的典型情况。您必须以某种方式同步它们。有很多解决方案:
使用小于毫秒(微秒,纳秒)的值来减少获得相同值的机会
添加另一个值使其更具随机性(例如线程ID)
使用AtomicLong
及其incrementAndGet
方法(而不是毫秒)
将数据库中的字段标记为唯一(总是一个好主意),因此它不允许插入重复的值,并且将引发异常。在控制器中,您可以捕获此类异常并尝试生成电子邮件并再次保存
将获取当前毫秒数的方法标记为synchronized
(因此不可能同时从不同的线程调用该方法,第二个线程将等待第一个线程)。虽然它应该可以工作,但是速度很慢,这就是为什么我在这里最后列出它的原因
关于java - Spring Rest重复检查在与100个用户同时运行服务时跳过了一些时间,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45861279/