`
2277259257
  • 浏览: 517816 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

springMVC一个Controller处理所有用户请求的并发问题

 
阅读更多

springMVC一个Controller处理所有用户请求的并发问题

有状态和无状态的对象基本概念: 
有状态对象(Stateful Bean),就是有实例变量的对象 ,可以保存数据,是非线程安全的。一般是prototype scope。
无状态对象(Stateless Bean),就是没有实例变量的对象,不能保存数据,是不变类,是线程安全的。一般是singleton scope。

如Struts2中的Action,假如内部有实例变量User,当调用新增用户方法时,user是用来保存数据,那么此action是有状态对象。多个线程同时访问此action时 会造成user变量的不一致。所以action的scope要设计成prototype,或者,User类放到threadLocal里来保持多个线程不会造成User变量的乱串(此种场景没必要放到threadLocal内)。

而Service内部一般只有dao实例变量 如userDao, 因为userDao是无状态的对象(内部无实例变量且不能保存数据),所以service也是无状态的对象。

public   class  XxxAction{

   // 由于多线程环境下,user是引用对象,是非线程安全的  

  public  User user;

  ......

}

public   class  XxxService {  

  // 虽然有billDao属性,但billDao是没有状态信息的,是Stateless Bean.   

  BillDao billDao;  

  ......

}

对于那些会以多线程运行的单例类

局部变量不会受多线程影响,
成员变量会受到多线程影响。

多个线程调用同一个对象的同一个方法: 
如果方法里无局部变量,那么不受任何影响
如果方法里有局部变量,只有读操作,不受影响;存在写操作,考虑多线程影响值;

例如Web应用中的Servlet,每个方法中对局部变量的操作都是在线程自己独立的内存区域内完成的,所以是线程安全的。 
对于成员变量的操作,可以使用ThreadLocal来保证线程安全。 

springMVC中,一般Controller、service、DAO层的scope均是singleton;

每个请求都是单独的线程,即使同时访问同一个Controller对象,因为并没有修改Controller对象,相当于针对Controller对象而言,只是读操作,没有写操作,不需要做同步处理。

 

Service层、Dao层用默认singleton就行,虽然Service类也有dao这样的属性,但dao这些类都是没有状态信息的,也就是 相当于不变(immutable)类,所以不影响。

Struts2中的Action因为会有User、BizEntity这样的实例对象,是有状态信息 的,在多线程环境下是不安全的,所以Struts2默认的实现是Prototype模式。在Spring中,Struts2的Action中scope 要配成prototype作用域。

 

 

Spring并发访问的线程安全性问题  

由于Spring MVC默认是Singleton的,所以会产生一个潜在的安全隐患。根本核心是instance变量保持状态的问题。这意味着每个request过来,系统都会用原有的instance去处理,这样导致了两个结果:
一是我们不用每次创建Controller,
二是减少了对象创建和垃圾收集的时间;
由于只有一个Controller的instance,当多个线程同时调用它的时候,它里面的instance变量就不是线程安全的了,会发生窜数据的问题。
当然大多数情况下,我们根本不需要考虑线程安全的问题,比如dao,service等,除非在bean中声明了实例变量。因此,我们在使用spring mvc 的contrller时,应避免在controller中定义实例变量。 
如:

publicclassControllerextendsAbstractCommandController{
......
protectedModelAndView handle(HttpServletRequest request,HttpServletResponse response,
Object command,BindException errors)throwsException{
company =................;
}
protectedCompany company;
}

 

在这里有声明一个变量company,这里就存在并发线程安全的问题。
如果控制器是使用单例形式,且controller中有一个私有的变量a,所有请求到同一个controller时,使用的a变量是共用的,即若是某个请求中修改了这个变量a,则,在别的请求中能够读到这个修改的内容。。

有几种解决方法:
1、在控制器中不使用实例变量
2、将控制器的作用域从单例改为原型,即在spring配置文件Controller中声明 scope="prototype",每次都创建新的controller
3、在Controller中使用ThreadLocal变量

这几种做法有好有坏,第一种,需要开发人员拥有较高的编程水平与思想意识,在编码过程中力求避免出现这种BUG,而第二种则是容器自动的对每个请求产生一个实例,由JVM进行垃圾回收,因此做到了线程安全。
使用第一种方式的好处是实例对象只有一个,所有的请求都调用该实例对象,速度和性能上要优于第二种,不好的地方,就是需要程序员自己去控制实例变量的状态保持问题。第二种由于每次请求都创建一个实例,所以会消耗较多的内存空间。
所以在使用spring开发web 时要注意,默认Controller、Dao、Service都是单例的

 

 

 

 

 

分享到:
评论
3 楼 leiguolin 2017-03-27  
楼主明显的误导人啊
2 楼 zxp209 2017-01-06  
局部变量,成员变量没搞清楚呢
1 楼 NiuBie 2017-01-05  
如果方法里无局部变量,那么不受任何影响;
如果方法里有局部变量,只有读操作,不受影响;存在写操作,考虑多线程影响值;
这里有问题吧。
方法里头的定义的变量,局部变量,都是存储在栈上,何来并发问题。

相关推荐

    springmvc+spring线程池处理http并发请求数据同步控制问题

    2. 通过在配置文件中声明一个ThreadPoolTaskExecutor bean,我们可以定制线程池参数,以适应不同场景下的并发需求。 3. 使用@Async注解可以标记方法为异步执行,Spring会自动使用配置的线程池来执行该方法,从而提高...

    SpringMVC与struts的区别

    它负责接收和处理用户的请求,并将其分发到对应的Controller中。DispatcherServlet是一个Servlet,因此可以在web.xml文件中配置多个DispatcherServlet实例。 HandlerMapping接口是SpringMVC中的一种处理请求的映射...

    netty整合SpringMVC实现下载

    - 创建 SpringMVC 的 Controller,定义处理下载请求的方法,该方法返回一个 ResponseEntity 对象,其中包含文件内容和 HTTP 响应头信息,如 Content-Disposition 和 Content-Type。 - 在 Netty 服务器端,创建一个...

    springmvc第一天课堂笔记.docx

    1. **前端控制器 DispatcherServlet**:这是SpringMVC的第一个环节,负责接收客户端发送的HTTP请求,并将其转发给合适的处理器进行处理。DispatcherServlet本质上是一个Servlet,因此需要在`web.xml`文件中进行配置...

    springmvc mongodb jquery 实现用户操作

    在这个项目中,"springmvc mongodb jquery 实现用户操作",我们将深入探讨如何整合这三个技术来构建一个能够处理用户操作的Web应用程序。 首先,SpringMVC是Spring框架的一个模块,专门用于构建MVC(Model-View-...

    SpringMVC(.html)

    - `@ControllerAdvice`注解用于定义一个全局的控制器顾问,可以处理所有控制器中的异常。 6. **视图技术**: - SpringMVC支持多种视图技术,如JSP、Freemarker、Thymeleaf等。 - 视图解析器(如...

    SpringMVC+sqlitejdbc的jar集合

    2. **Controller**:处理业务逻辑,将用户的请求转化为服务层可以理解的操作。 3. **Model**:代表应用程序的数据模型,通常与业务对象相对应。 4. **ViewResolver**:解析视图,将模型数据呈现给用户。 SpringMVC...

    springMVC补全实现

    在这个项目中,我们有一个名为`Controller`的类,其中包含处理补全请求的方法。 3. **Model**:模型对象封装了业务数据,可以是JavaBean或其他对象,用于传递数据。 4. **View**:视图负责渲染和展示数据,这里...

    SpringMVC整合RedisDemo

    通过这样的整合,SpringMVC应用能够利用Redis的高速缓存能力,提高数据处理速度,尤其在处理高并发请求时,可以显著降低数据库的压力,提升整体系统性能。同时,这也是一种常见的微服务架构中的缓存策略,可以作为...

    springMVC笔记

    Controller处理完请求后,会返回一个ModelAndView对象,该对象包含模型数据(Model)和视图名称(View)。Model是用于呈现视图的数据,它可以是一个Map对象,将数据与键值对关联。View负责将模型数据渲染成用户可见...

    springmvc+spring+mybatis+redis是实现秒杀

    综上所述,这个项目利用SpringMVC处理HTTP请求,Spring管理业务逻辑和Bean,MyBatis负责数据持久化,而Redis则提供高速缓存和分布式锁机制,共同构建了一个能应对高并发、保证数据一致性的秒杀系统。这样的设计既...

    SpringMvc(4.0)+hibernate(4.0)

    SpringMvc 是一个基于 Java 的轻量级 Web 开发框架,它是 Spring 框架的一部分,主要用于处理 Web 请求和控制应用程序的流程。在 SpringMvc 4.0 版本中,它引入了对 Servlet 3.0 的支持,提供了更好的异步处理能力,...

    基于SpringMVC实现的秒杀系统.zip

    在Web开发领域,SpringMVC是Spring框架的一个模块,用于构建高效、灵活的Web应用程序。它提供了一种模型-视图-控制器(MVC)架构,使得开发者可以将业务逻辑、数据处理和用户界面分离,从而提高代码的可维护性和可...

    Go-goweb一个基于go语言开发API的工具这个工具受到了SpringMVC的启发

    例如,你可以定义一个处理GET请求的`/users`路由,来获取用户列表。 控制器是Go-goweb的核心组件之一,它们类似于SpringMVC中的Controller。你可以创建自定义的控制器来处理业务逻辑,接收和响应HTTP请求。Go-goweb...

    SpringMVC面试专题及答案.pdf

    作为一个轻量级的框架,SpringMVC 提供了一种灵活的方式来处理 HTTP 请求,并且能够与 Spring 生态系统中的其他组件无缝集成。 #### 2. SpringMVC 的优点: - **基于组件技术**:所有的应用对象,无论是控制器、...

    spring和springmvc整合 jar包

    SpringMVC是Spring框架的一个模块,专门用于处理Web应用程序的请求-响应模型。它是一个基于Model-View-Controller(MVC)设计模式的轻量级Web框架,可以帮助开发者构建高性能、易于测试的Web应用。 整合Spring和...

    SpringMVC Mybatis RabbitMQ例子

    例如,当用户发起一个耗时的操作(如批量数据处理),SpringMVC可以接收到请求,然后通过RabbitMQ发送一个消息到消息队列,后台的消费者监听这个队列并执行实际的任务,而用户则可以立即收到一个确认响应,提高了...

    SpringMVC-Mybatis-Shiro-redis

    本文将深入探讨一个基于SpringMVC、Mybatis、Shiro和Redis的Web应用架构,这四个组件共同构成了一个强大而灵活的框架,能够满足复杂业务需求并提供高性能的数据处理和用户权限管理。 首先,SpringMVC作为Spring框架...

    SpringMVC+Redis+MyBatis项目

    在实际运行中,当一个请求到达时,SpringMVC会根据URL映射找到对应的Controller方法,该方法可能需要从数据库获取数据。这时,Spring会检查是否有缓存策略存在,如果有且数据还在有效期内,直接从Redis中获取;否则...

    基于springmvc的websocket及时聊天

    Spring MVC是Spring框架的一个模块,主要用于构建Web应用的Model-View-Controller结构。在这里,我们将探讨如何结合Spring MVC和WebSocket实现一个即时聊天系统。 首先,为了创建一个基于Spring MVC的WebSocket聊天...

Global site tag (gtag.js) - Google Analytics