我有一个关于 spring mvc 和线程安全的问题。
我们正在开发将存储在 tomcat 上的 Web 应用程序。如果我理解正确,Tomcat 会为每个请求创建线程并且它有一些线程池。现在,调度程序 servlet 在请求之间共享,并且可能是线程安全的。
但是当我这样创建控制器时:
@Controller
@RequestMapping("/manage")
public class QuestionManagementController {
他有Singleton
范围,因此来自每个用户的每个请求都使用相同的控制器。
我想知道这个问题通常是如何解决的:
1:控制器是用Session
范围创建的吗?(但我认为,如果一个用户快速执行一些可能导致控制器出现竞争条件的事情,也可能会出现问题)。
2:控制器的范围为request
3:创建在类级别不共享任何变量的无状态控制器,或者让它们处于只读模式
或者也许有一些更好的“最佳实践”可以解决这类问题。
我在问这个问题,因为现在我们将它们作为Singleton
作用域,并且存在一个问题,即在大多数方法中,我们在数据库中查询用户,并且由于作用域的原因,我们无法将此信息存储在类级别变量中。我们可以尝试使用一些线程安全的集合,但稍后可能会有其他资源需要同步访问。