这几天在做公司内部SpringMVC的培训,培训之余看了看大家的代码,总感觉一个很不爽的地方,就是在每一个控制器的执行方法里,总要写这样一段代码:
代码1:
Map model = new HashMap(); model.put("yourKey", "yourObject"); ModelAndView mv = new ModelAndView("yourPage", model); ... ... return mv;
每个请求就要new 一个Map和一个ModeAndView对象,这样如果请求多,就在不停的做new操作。new操作对JVM来说开销算是比较大的,所以尽量少建新对象。
在上面的例子中我们用ModelAndView的构造函数是public ModelAndView(String viewName, Map model),打开该构造函数的源码:
代码2
public ModelAndView(String viewName, Map model) { this.view = viewName; if (model != null) { getModelMap().addAllObjects(model); } } //getModelMap()的代码: public ModelMap getModelMap() { if (this.model == null) { this.model = new ModelMap(); } return this.model; }
可以看出我们在java 代码1中创建的Map,在被提取值以后就没有什么用了。所以在Controller里面创建Map对象是冗余操作。
代码1应该如下写:
代码3
ModelAndView mv = new ModelAndView(); Map model = mv.getModelMap(); model.put("yourKey", "yourObject"); ... ... return vm;
这样一来就少创建了一个对象,节省了一点点开销。
可是还是每次都要创建ModelAndView新实例,如果一个网站的日访问量是10万(当然,访问理大的网站都会考虑用静态页面的方法),那么一天这个JVM就要创建10万个ModelAndView实例。这样的开销就很大了。
一般的解决办法就是让ModelAndView能够循环利用,要想循环利用ModelAndView就要有一个Pool,在我们需要可以通过Pool.get方法来取出ModelAndView实例,在不需要时在调用Pool.release(ModelAndView)把它放回。需要进取出总是很好办的,问题在什么时候可以调用release方法来释放。解决这个问题只能看SpringMVC的源码,看看有没有解决办法。
最笨方法的就是顺藤摸瓜,每一个请求到来都要先到DispatchServlet的doService。打开源码找到这个方法,发现也没有什么了不起的地方,可是发现一个醒目的片段: try {
doDispatch(request, response);
}
finally
看来重要工作还在doDispatch中,那么就再找到doDispatch。
在doDispatch方法的前半部分是得到Controller返回的ModelAndView对象,后半部分是做显示处理,其中有这样一个显赫的代码段:
// Did the handler return a view to render?
if (mv != null && !mv.wasCleared()) {
render(mv, processedRequest, response);
}
在被调的render方法里,就可以看出当render方法执行完后,ModelAndView对象已经不会再被使用,唯一能用到它的就是垃圾回收器了。(如果不信,你可以继续往下看, 以后工作都在View的子类里跑)
所以在render方法结束以后,再把ModelAndView对象放入缓存是正确的。我们可以继承DispatchServlet,然后把render方法重写,再用一个List作为简单的缓存池,实现如下:
代码4
public class CustomDispatchServlet extends DispatcherServlet { private static List<ModelAndView> modeAndViews = new ArrayList<ModelAndView>(20); static{ for(int i = 0; i < 20; i++){ //缓存量为20 modeAndViews.add(new ModelAndView()); } } public void render(ModelAndView mv, HttpServletRequest request, HttpServletResponse response) throws Exception{ super.render(mv, request, response); releaseModelAndView(mv); } //回收ModelAndView private void releaseModelAndView(ModelAndView mv){ mv.clear(); mv.getModelMap().clear(); synchronized(modeAndViews){ modeAndViews.add(mv); } } //取ModelAndView public static ModelAndView getModeAndView(){ synchronized(modeAndViews){ if(modeAndViews.size() > 0) return modeAndViews.remove(0); else return new ModelAndView(); } } }
当然你的web.xml的配置应改为:
代码5
<servlet> <servlet-name>test</servlet-name> <servlet-class>your.package.CustomDispatchServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet>
然后你Controller里的执行代码也应改成如下:
代码6
ModelAndView mv = CustomDispatchServlet.getModeAndView(); mv.setViewName("yourPage"); mv.getModel().put("attribute", "yourObject"); ... ... return mv;
整个完成以后,测试起来屡试不爽。
整个下来,没有做太大的改到,也降低了开销。
还有一点要提醒一下,如果你用JSP做为页面,请不要用在ModelAndView的Map里放什么东西,这样Spring要做很多无用功,如果有东东全放入HttpServletRequest中,要想研究的话可以看看InternalResourceView的方法renderMergedOutputModel
相关推荐
项目概述:本项目采用Java为主要开发语言,整合了Spring MVC与MyBatis框架,实现了一套基于SSM框架的Web系统。...简而言之,本项目是一次成功的框架结构转换实践,不仅优化了系统架构,也提升了开发效率和系统性能。
本文提出了一种基于 SSM 的民宿网站的解决方案。该网站旨在为用户提供预订民宿的服务。...在该系统中,采用了前后端分离的架构,前端使用了 Bootstrap 和 jQuery 等前端框架,可以提升页面的性能和用户体验。
【软件测试】性能测试从零开始:LoadRunner入门与提升,欢迎下载
本视频教程全面介绍了基于SSM(Spring, Spring MVC, MyBatis)框架的商城系统的开发流程。SSM是Java Web应用开发的三大主流框架,广泛用于构建企业级应用。教程内容涵盖: Spring框架的基本概念和依赖注入(DI)机制 ...
学生在线网络考试系统,采用Spring与Spring MVC技术栈进行深度整合,打造了一个功能齐全、性能卓越的在线考试平台。该系统通过Spring的依赖注入和面向切面编程等核心特性,实现了组件间的松耦合和高内聚,大大提升了...
本文提出了一种基于 SSM 框架的教务管理系统的解决方案。该教务管理系统旨在为学校管理人员提供...在该系统中,采用了前后端分离的架构,前端使用了 Bootstrap 和 jQuery 等前端框架,可以提升页面的性能和用户体验。
通过整合Spring Security、Spring MVC等组件,我们实现了用户认证与授权、请求处理与响应等功能。同时,我们采用MySQL作为数据库管理系统,通过JPA或MyBatis等持久层框架实现数据的存储和查询。 综上所述,“基于...
#语句助手线程数,可设置为0,该参数会降低运行速度,但程序有大量的查询语句时,有助于提升高并发程序的性能 bonecp.statementReleaseHelperThreads = 0 #测试连接有效性的间隔时间,单位分钟 bonecp....
本项目旨在通过实际案例演示多线程的应用及其带来的性能提升,同时深入探讨如何在多线程环境中保证线程安全。项目涉及前端展示、后端逻辑处理、数据库操作等多个模块,全面展示了从前端到后端的一体化解决方案。 ...
为此,我们开展了基于SSM(Spring、Spring MVC、MyBatis)和VUE技术栈的J2ME手机游戏开发项目,旨在探索和实践如何利用现代技术实现高效的J2ME手机游戏开发。 项目目的 提高开发效率:通过SSM和VUE技术栈,简化开发...
JEEBBS最新版本采用hibernate3+spring mvc+spring3+freemarker技术架构,重新设计了jeebbs,重新架构后的JEEBBS性能得到了很大的提升,功能相比jeebbs v1.0也丰富了许多。
本文将深入分析weixin057马拉松报名系统,该系统基于微信小程序和SSM(Spring, Spring MVC, MyBatis)框架构建,旨在提供一个用户友好且功能全面的在线报名平台。 微信小程序作为前端展示层,利用其轻量化和易传播...
Spring MVC:利用Spring MVC框架实现项目的Web层管理,实现了前后端分离,提高了系统的可扩展性和性能。 Hibernate ORM:采用Hibernate框架实现对象关系映射,简化了数据持久化操作,提高了数据访问效率和可靠性。 ...
因此,开发一个基于SSM(Spring、Spring MVC、MyBatis)和Vue的在线考试管理系统显得尤为重要。 2. 目的 本项目的主要目的是设计和实现一个功能全面、性能优越、用户体验良好的在线考试管理系统,具体目标如下: ...
SSM项目基于微信小程序的闲置品交易平台_1509x.zip是一个使用Java语言开发的Web应用,它采用了Spring、Spring MVC和MyBatis(SSM)框架,并结合了微信小程序的前端技术。该项目的目标是创建一个便于用户在微信环境中...
本项目基于SSM(Spring、Spring MVC、MyBatis)和VUE技术栈,旨在构建一个高性能、易扩展的公共资源管理系统,满足多样化的业务需求。 项目目的 资源共享:建立统一的公共资源管理平台,实现资源的高效共享和利用。...
本项目旨在设计和实现一个基于SSM(Spring、Spring MVC、MyBatis)和Vue的在线购物系统,具体目标如下: 提高性能:通过合理的系统架构设计和性能优化技术,提高系统的响应速度和处理能力。 提升用户体验:采用现代...
该系统基于SSM框架,结合了Spring、Spring MVC和MyBatis框架的优势,具有稳定性高、性能优越等特点。系统包括了企业招聘管理、职位发布、简历筛选、面试管理等功能模块,能够帮助企业高效地招聘人才。求职者可以在...
本项目基于SSM(Spring、Spring MVC、MyBatis)和VUE框架,旨在开发一款在线扫雷游戏,实现玩家的在线互动和记录管理。 目的 增强娱乐体验:通过网络化的扫雷游戏,增强玩家的互动性和趣味性。 提升用户粘性:通过...