jsp应用在大型网站上由于编译循环死锁无法完成发布

news/2024/4/27 9:17:03/文章来源:https://blog.csdn.net/zwwwxy/article/details/376578

jsp实际上是servlet草稿,在第一次运行时由服务器编译成servlet,以后每次重启就把已经编译好的serlvet载入内存,成为一种系统服务。因此,在重新发布后第一次访问的速度会比较慢,是可以理解的。“比较”的意思就是明显可以感觉到推延,但充其量在第二第三次访问后就会变快,这是 jsp的常识。但近日的几次发布失败,似乎是在挑战这条常识,而结论是直指jsp2.0系统级结构的不合理。

这是第二第三次,在发布时速度极慢,以致于无法完成发布。原因呢?几乎每一个可能性因素都被有根据将它否定,目前仍是未明。最早是在周二第一次发布,在晚上到测试服务器上发布,这是小流量测试服务器,结果到第二天中午几次重启,仍没有完成发布。此前也有过明显的大概几个小时的缓慢记录,但象这样几乎无法完成,却是第一次碰到。要知道,在开发和初步测试时,都只是在第一次刷新时延迟了几秒,不至于象进入死循环一样长久没有反应,甚至发展到内存溢出的程度。

当时对系统的修改程度归纳一下,与前面的系统应用相比,有以下几项变动:一是引入了tagfile代替include小文件;这样可以不考虑路径,并大大增强可配置性;对于不值得为之写class但重用性又挺高,却又稍有差别的presentation代码,的确较 include更佳;第二,是引入了jstl,这是为了规范化,因为懂strutslogic:hanva条件标签的人不多;而且swithcase逻辑的表达,以及多个连续条件的表达,jstl比strutslogic要强。因此,很自然就会怀疑到是这两样东西带来的问题,而且所有没有使用这两样东西的界面都比较地正常。

相比之下,tagfile是问题的核心的可能性更大,但却更加有吸引力。jstl的感觉是有点不妥,它的uri是连到 sun的core地址;而且可轻易使 用原来的logic代码替换。我不明白jstl是如何能够懂得从standard.jar中找到它的tld的,这不符合jsp标签的RFC说明:由taglib指向的tld/xml文件进行标签使用说明;我想它多多少少会与向http://java.sun.com/jstl/core那个网址发请求,得到指示后再转向 stardard.jar中找那个tld文件。所以如果网络上不通或者大量请求拥挤,在编译时就有可能由于网络等待而造成长时间的停顿。

我决定先排除这种情况,使用旧的自已修改的logic系统条件标签更替jstl中的流程控制。结果真怪,才换了一半,就顺风顺水地统统畅顺了。结果显示似乎直指是由于这个jstl需要网络请求才能解析导致编译时等待。为了验证这个想法,我把所有的jstltaglib的directives全部改成 c.tld;和其他的一样,这样就绝无可能再出现网络请求的延时了。而且每次发布升级时都把先前的编译结果(在work目录中)全部删除,砍保全新的编译,也的确是每次都顺风顺水几乎是立刻发布成功。包括昨天下午五点钟的一次发布,几乎是立刻成功,毫无延时了(那时侯的网络访问流量是最大的,最低同时请求达到一百个以上)。也正是由于这样的鼓励,我进一步使用tagfile代替那些重用程度很高的小代码——它们已经让我有点糊涂了,不得不在前台花了大量的时间,接近一半时间了,而正常情况下,presentation 层的编码不应该超过10%的工作比例,还主要是修正页面人员的错误而操作。

但当晚上再修改了一点地方,进行再一次发布时,这时的网络流量是一天最低的时侯,却再次出现了第一次那种情况,由于系统屡屡由于内存溢出而退出服务状态,我把系统设为每小时自动退出一次重启应用一次,那么就算它某个小时退出了,在整个晚上也不会中止的。同时在另一台流量较小的服务器上也同样发布。但结果似乎是一模一样的:两台在线服务器都是到早上仍没有恢复工作;而在我的开发测试的非在线服务器上,就快得出奇。几台服务器的状况是一样的,也是先删除原 work中的文件后再发布,但结果就是不同。唯一的区别就是存在网络请求,但上面的几个结果又把这个设想否定了N次了。

进一步的深入到 work的目录中,发现网上服务器的程序编译有一个怪事:所有的在线实时编译的tagfile文件(实际上是实现 SimpleTagSupport接口的标签的jsp草案)在某一个jsp文件调用后完成一次编译,在另一个同样调用它的jsp文件再调用它(那个文件也要重新编译)时,它会再编译一次,并清空前面的结果:这就不对了!除非tagfile改变,它不应该反复编译。从情况看,很象是由于多个jsp文件同时被请求时,对这个tag文件同时提出编译请求,由于sychronized锁定了,所以出现多重的等待。

这就是说:如果任何一个大型的网站,同时请求访问比较多,而jsp顶级文件也比较多时,几乎是不可能完成发布的:几千个文件会长时间地产生资源争夺;反复死锁。也正是在大型网站逻辑复杂的情况下,才会特别需要使用这种连前台逻辑也是模型建立。这就变成了,普通的jsp程序方式,多顶级模板(jsp文件)的是不适合于大网站的。这是目前最有可能的解释,但同样由于前几次的顺利升级而显得仍然缺乏说服力——需要又增加了一些 tagfile文件。

但无论如何,工作服务器必须恢复正常,而现实情况下是似乎永远无法初始化完毕,而服务器断断续续的响应已经近十个小时了,尽管大部分是在夜晚。万般无奈的情况下我搞了一个怪招:本地的初始化速度快是不是?那我就做了一个自动化的请求,在本地向本地的一台服务器一页页的把需要访问的页面统统访问一次,这样就令本地的jspweb服务器把该编译的统统编译好,然后就把这编译好的文件,(妈呀,原来有几百兆呢!)上载到工作服务器,替换那拖拉机般在缓慢增加的 work目录中的文件;呵呵,行了!

答案仍然是不清晰的,只能说最有可能的因素是两个:
一是由于jsp缺乏顶级模板的功能,所以不得不因为逻辑需要分成若干个文件,当这些文件达到一定程度时,象目前的工程上是几十个连锁子单位每个有十几个顶级文件,再发布到请求相当大的网站上(目前这个网站alea排名最高达2000),就会在发布时由于同时总会有几十个大文件处于同时编译过程中;而导致系统在极限边缘运转;

二:jsp标签协议有漏洞;表现为部分标签在常常在修改后除非删去已经编译好的class,否则系统始终载入旧的未升级的class;更严重的是,对于 tagfile这种jsp化的动态标签,如同上面说的,不同的调用它的jsp文件在进行更新编译时,会重新编译它调用的tagfile;并进行同步锁定。这显示是一个逻辑错误!同时,一旦未完成编译的jsp发布它调用的tagfile.class改变了(实际上是重新编译了),它就重新再次编译,也再次锁定目标的tagfile文件。这样就形成一个实际上的死循环。

这两个因素任何一个都不致命;两个结合在一起,仍不足以致命,但如果再加上第三个因素:大流量请求,就变成致命了:在这样的服务器上难以发布这样的系统,永远的,jsp似乎不能完成最后的编译工作。

解决方法除了象上面这样的无赖手段外,另一个办法就是不删除旧的work文件,而在发现不对时手工清除那些文件,这样可以降低编译负载;但每一次的发布升级就成了一个繁杂的工程了;要过相当长的时间却能确定运行的是新的程序。作为jsp2.0服务器方面,应该检查一下这种bug是如何来的,毕竟如果jsp 只能是给简单的网站使用的话,倒不如赶快关门算了;jsp技术发展上的设计变成了主要满足初学者扫盲,是java技术委员会最弱智的,也是最不及微软的地方。而在这两项之外,要想解决这个问题的办法之一就是减少jsp的顶级模板,多使用条件判断调用不同的jsp文件,这样就可以把需要编译的文件降低一个数量级,减少由于同时编译的文件多发生煞费死锁的可能性。最后就是避免使用tagfile,毕竟这是可以使用SimpleTagSupport直接编写,或者使用include 替代的,虽然不算太方便。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_872115.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

对Web开发人员有用的8个网站

摘要:本文是由比利时的Web开发人员Jean-Baptiste Jung分享的,Jung还在《 Web开发/设计人员应当知道的15个网站 》这篇文章中推荐了15个相关网站。 导读:本文是由比利时的Web开发人员Jean-Baptiste Jung分享的,Jung还在《Web开发/设…

不修改代码就能优化ASP.NET网站性能的一些方法(推荐)

来自:http://www.cnblogs.com/fish-li/archive/2012/12/23/2830301.html 阅读目录 开始配置OutputCache启用内容过期解决资源文件升级问题启用压缩删除无用的HttpModule其它优化选项 本文将介绍一些方法用于优化ASP.NET网站性能,这些方法都是不需要修改…

35个优秀的电子商务网站界面

来自:http://www.cnblogs.com/chuncn/archive/2009/11/18/1605053.html 用户体验是在各个类型的网站中有着非常重要的位置,尤其对于电子商务网站更是如此。差的用户体验会导致访问者无法购买自己想要的商品,订单也就消失。下面我们介绍35个用…

C# 网站静态页面生成器 for 多线程版

来自:http://www.cnblogs.com/keke/archive/2010/09/07/1820871.html#2454265 摘要:该生成器是用于放置于服务器上的一个小程序,用于生成站点中需要静态化的页面生成。我写c/s程序不多,所以本程序可能会有些小的bug。还望高手多多…

电子商务网站搜索架构方案

来自:http://www.jqpress.com/post/34.aspx 说是电子商务搜索架构方案,其实就是lucene.net的应用,公司庙小,人少,也就自己平时看看,以前做过一点例子,这样就被拉上去写架构方案了。我这个懒惰的…

PhantomJS在Windows7下实现网站自动下载截图

来自:http://www.cnblogs.com/huangcong/archive/2013/04/18/3027654.html 1. phantomjs介绍 基于Javascript驱动的命令行webkit引擎,轻量级,安装简单,开发快速,渲染速度较快,无界面的webkit浏览器。 phont…

做科研必备的良心网站

做科研必备的良心网站 在日常学习工作中,你是否也会因为常常忘记一些文献检索库而烦恼呢?但遇到我后,再也不是事了,我会具体按照中英文献库的分类,对经常使用的数据库不断地总结。如果需要检索对应的数据库,可以直接…

2019-06-04 9个接私活的网站,你有码,我有钱

很多有技术的码农们浑身的葵花宝典,辟邪剑法,十八般武艺,但不能一身的本事空空浪费,现在小编就给大家推荐几个接私活的秘籍,助你收入飙升,纵横码农圈,众猿皆披靡。但你如果只是眼中有码&#xf…

大型高并发高负载网站的系统架构

一个小型的网站,比如个人网站,可以使用最简单的html静态页面就实现了,配合一些图片达到美化效果,所有的页面均存放在一个目录下,这样的网站对系统架构、性能的要求都很简单,随着互联网业务的不断丰富&#…

多语言网站生成静态页面实现思路以及用freemarker作模板生成静态页面的实现

现在呀,越来越多的网站要求做成多种语言,并且,大家好像都知道了html比动态的运行快,所以,也倾向自动生成静态页面这个功能,我就纳闷了,消息怎么传的那么快呀!好吧,说说多语言网站生成静态页面时候的主要瓶颈在哪些方面吧: 1.首先是列表类型的文章分页的生成 这个吧,肯定需要有…

在个人网站中引入Markdown编辑文本

Markdown是一种可以使用普通文本编辑器编写的标记语言,通过简单的标记语法,它可以使普通文本内容具有一定的格式。 下载地址 https://github.com/evilstreak/markdown-js/releases 选择markdown-browser-0.6.0-beta1.tgz 下载后解压会得到两个库文件…

推荐几个免费好用的毕业论文(设计)文献查找网站包括外文文献(亲测有用)

1、剑桥大学 https://www.repository.cam.ac.uk/discover 2、ScienceDirect https://www.sciencedirect.com/ 3、CiteSeerX http://citeseerx.ist.psu.edu/index 4、Open Accsess Library https://www.oalib.com/ 5、国家科技图书文献中心 http://oar.nstl.gov.cn…

推荐两个免费的论文查重网站(24小时一次)

推荐两个免费的论文查重网站(一天24小时一次) 这两个都要扫码登陆,然后选择免费查重,在后面的选择中要钱的都不要选择就能直接提交选择查重。 PaperWord https://www.paperword.com/ PaperYY https://www.paperyy.com/

网站优化策略

网站的优化建议 页面尽量只使用div标签并且嵌套层级不要太多。Html页面不能包含css、JavaScript代码,全部放到单独的文件。title标签包含关键词不要超过3个,每个页面title内容要对应页面内容。Description标签包含关键词4~5次,每个页面描述除…

4000万美元维护一个网站,贵吗?

5亿用户,365*24h连续运行,完美的浏览器(桌面/移动)兼容性,优秀的用户体验,一流的问题解答团队,TB级数据管理,支持300种语言,这是一个网站,非营利性&#xff0…

网站服务配置过程 nginxⅠ

1. nginx程序目录结构信息 /etc/logrotate.d/nginx 利用logrotate实现日志文件自动切割利用脚本定时任务实现日志切割#!/bin/bashmv nginx.log nginx.log_$(date %F_%T)systemctl restart nginx/etc/nginx/nginx.conf 主配置文件 /etc/nginx/conf.d/default…

网站服务架构部署(LNMP)

1. LNMP架构说明 LNMT: linux nginx mysql tomcat LNMP: linux nginx mysql php/python LAMP: linux apache mysql php 作用: 可以使用架构处理动态访问请求2. LNMP架构部署过程 Linux : 1) 系统安全服务需要关闭 selinux iptables 2) 确认系统/tmp目录权限 1777nginx : 1) 安…

网站服务负载均衡 Ⅰ

1. 负载均衡详述部分 Syntax: upstream name { ... } --- 指定可以分配用户请求web节点信息 Default: — Context: http分配后端节点方式方法: 根据能力进行分配用户访问请求 weight --权重 按比例进行权重分配访问资源 upstream oldboy { server 10.0.0.7:80 weight3; se…

python爬虫爬取网站文章

这次爬取网站为:‘http://www.agri.cn/kj/syjs/zzjs/’ 程序大致分为六步: 1、引入相关的库和设置两个正则表达式规则 2、设置爬取的网页数量 3、设置网页中包含文章的HTML部分 4、在获取的部分中提取包含文章连接的HTML语言 5、获取文章连接 6、根…

【服务器】iis的重启服务器、重启iis、回收(重启)线程池、刷新网站

windows自带iis,如果没有的也可以控制面板中启用 1、在开始按钮点击右键,选择控制面板。 2、接着我们从控制面板选择“程序”。 3、然后选择“启用或关闭windows功能”。 4、从列表中选择Internet Infomation Services。 5、并且把相应的功能条…