【发布时间】:2012-08-20 17:35:55
【问题描述】:
我有一个关于 spring mvc 和线程安全的问题。
我们正在开发将存储在 tomcat 上的 Web 应用程序。如果我理解正确,Tomcat 会为每个请求创建线程并且它有一些线程池。现在,调度程序 servlet 在请求之间共享,并且可能是线程安全的。
但是当我这样创建控制器时:
@Controller
@RequestMapping("/manage")
public class QuestionManagementController {
他拥有Singleton 范围,因此来自每个用户的每个请求都使用相同的控制器。
我想知道这个问题通常是如何解决的:
1:控制器是否使用Session 范围创建? (但我认为,如果一个用户快速执行一些可能导致控制器出现竞争条件的事情,也可能会出现问题。
2:控制器的作用域为request
3:创建在类级别不共享任何变量的无状态控制器,或者让它们处于只读模式
或者也许有一些更好的“最佳实践”可以解决这类问题。
我在问这个问题,因为现在我们将它们作为Singleton 作用域,并且存在一个问题,在大多数方法中,我们正在查询数据库中的用户,并且我们无法将这些信息存储在类级别由于范围而变量。我们可以尝试使用一些线程安全的集合,但稍后可能会有其他资源需要同步访问。
【问题讨论】:
-
您不能在实例变量中存储什么信息?
-
User类的对象,如果有多个用户请求,如果控制器的范围是单例,我需要存储此信息是某种同步集合。这就是为什么我想知道是否应该将它们设为Session作用域。 -
为什么需要将它存储在控制器中?你不能从会话中得到它吗?
-
你的意思是,用会话对象存储这些信息?
-
会话级用户信息还能去哪里?
标签: java tomcat spring-mvc thread-safety