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作用域。

时间: 2024-10-09 00:08:10

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

springmvc中针对一个controller方法配置两个url请求

springmvc中针对一个controller方法配置两个url请求 标签: spring mvc孙琛斌 2015-12-10 17:10 2189人阅读 评论(0) 收藏 举报  分类: Spring(8)  版权声明:本文为博主原创文章,未经博主允许不得转载. 记录一个小知识点. 某些应用场景>..你可能需要不同的url请求得到相同的结果,那么你写两个方法总是不太好的,使用下面的方法可以解决这个问题. @RequestMapping(value = { "/item/index.ht

SpringMVC实现一个controller写多个方法

MultiActionController与ParameterMethodNameResolver在一个Controller类中定义多个方法,并根据使用者的请求来执行当中的某个方法,相当于Struts的DispatcherAction.使用MultiActionController需要配个MethodNameResolver实例,默认使用ParameterMethodNameResolver,他会根据所给的网址中,最后请求的文件名称来判断执行Controller中的哪一个方法 1.控制器类继承M

SpringMVC从Controller跳转到另一个Controller(转)

http://blog.csdn.net/jackpk/article/details/44117603 [PK亲测] 能正常跳转的写法如下: return "forward:aaaa/bbbb.do"; return "redirect:aaaa/bbbb.do"; return new ModelAndView("forward:bbbb.do", null); return new ModelAndView("redirect:b

restful风格url Get请求查询所有和根据id查询的合并成一个controller

restful风格url Get请求查询所有和根据id查询的合并成一个controller的方法 原代码 // 127.0.0.1:8080/dep/s @ApiOperation(value="查询所有", notes="查询所有") @RequestMapping(value = "/s",method = RequestMethod.POST) public List<Dep> deps() { return depServic

SpringMVC框架Controller类就是一个单例类

Springmvc框架Controller类就是一个单例类,所以他在速度和性能上是比较优越的. 这里需要特别注意的一点是:如果一个类已经是单例类了,你就不要在手动的创建类的对象了,这种做法是不可取的,会对系统造成较大的开销.最致命的一点就是,在并发环境下,会导致查询出来的数据错乱. 一般情况下,controller中只会有service对象,因为service是接口,不会存在成员变量一说,接口嘛,只会有常量和方法,不会存在资源的抢夺问题. 原文地址:https://www.cnblogs.com

SpringMVC从Controller跳转到另一个Controller

1. 需求背景 需求:spring MVC框架controller间跳转,需重定向.有几种情况:不带参数跳转,带参数拼接url形式跳转,带参数不拼接参数跳转,页面也能显示. 本来以为挺简单的一件事情,并且个人认为比较常用的一种方式,一百度全都有了,这些根本不是问题,但是一百度居然出乎我的意料,一堆都不是我想要的结果.无奈啊,自己写一篇比较全都供以后大家一百度吧,哈哈哈...是这些写的不是很全都人们给了我写这篇博客的动力. 2. 解决办法 需求有了肯定是解决办法了,一一解决,说明下spring的跳

使用IntelliJ IDEA开发SpringMVC网站(四)用户管理

原文:使用IntelliJ IDEA开发SpringMVC网站(四)用户管理 摘要 通过对用户表的管理,更加深入地讲解SpringMVC的操作. 目录[-] 文章已针对IDEA 15做了一定的更新,部分更新较为重要,请重新阅读文章并下载最新源码. 七.用户管理 1.JPA操作定义 2.后台管理 (1)查看所有用户 (2)添加用户 (3)查看用户详情 (4)修改用户信息 (5)删除用户 转载请注明出处:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) . 注:在阅读本文前,请先阅读:

SpringMVC中@Controller和@RequestMapping用法和其他常用注解

一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示.在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 和@RequestParam 等一些注

SpringMVC中@Controller和@RequestMapping用法

一.简介 在SpringMVC 中,控制器Controller 负责处理由DispatcherServlet 分发的请求,它把用户请求的数据经过业务处理层处理之后封装成一个Model ,然后再把该Model 返回给对应的View 进行展示.在SpringMVC 中提供了一个非常简便的定义Controller 的方法,你无需继承特定的类或实现特定的接口,只需使用@Controller 标记一个类是Controller ,然后使用@RequestMapping 和@RequestParam 等一些注