musicman 2013-03-06
都是was缓存惹的祸
http://forum.pusuo.net/posts/list/409.page
在项目中经常遇见这样的问题:修改应用的配置文件web.xml后,无论重启应用还是重启WebSphere服务器,都不能重新加载web.xml,导致修改的内容无效。
这个问题困扰了我好久,即使删除了${was安装目录}/IBM/WebSphere/AppServer/profiles/AppSrv01/下的temp和wstemp两个缓存文件夹下的临时文件,重启后还是无效。几经折腾,后来终于找到了问题所在——还是由于was的缓存机制导致的。
找到${was安装目录}/AppServer/profiles/AppSrv01/config/cells/xxxNode01Cell/applications/${应用名}.ear/deployments/目录下,有一个与应用相同名称的缓存文件夹,删除或修改该文件夹的web.xml,重启was即可。
web.xml文件在websphere中会有两个地方存储
一个websphere的问题,首先声明一下我对websphere的目录结构并不是很了解,如果了解它的目录结构也就不会犯下这样的错误:
我们做应用项目需要发布到websphere上,项目经理让我为应用整体作一个限制,要求是:当系统跑批时间不允许用户登录系统;于是我想了良久发现用过滤器来做最合适不过了。开始准备了,写好过滤器进行配置后发现我的过滤器怎么样不生效,这样我就又调整了一下过滤器的位置,发现过滤器生效和了,可以由于应用本身使用了struts2,这样我的过滤器添加在struts2的过滤器之前就会出现问题:如果我的过滤器生效就不会再经过struts2的过滤器,在返回到页面的时候就会报为经过struts2过滤器的错误。之后一段时间我没有什么办法了,再经过一段时间的思考之后,我决定修改struts2的过滤器,起始也不知道从什么地方下手,于是开始看struts2的源代码,发现可以对其分发器Dispatch进行修改:就是在分发器分发之前判断如果时间是在跑批时间就让它跳转到固定页面(登录页面),经过修改终于成功了。我的调试服务器是tomcat5.5没有什么问题,昨天我们发布到websphere上后发现也是能够正常运行的。晚上我欣喜地回到了住处,突然有个同事打电话给我说他修改了web.xml中的相关时间的配置信息重启服务器后配置信息并没有生效。
今天早晨我开始寻找问题,发现不管怎么修改它确实不会生效,经过和同事讨论:想法是websphere应该有缓存目录,找找看还有没有其他地方对web.xml有存储。于是使用find命令找web.xml文件,突然屏幕上出现两个前缀和我们的应用名称相同的web.xml文件,一个是我们预先知道目录(../AppServer/profiles/AppSrv01/installedApps/loopbackNode01Cell/),另一个是(config/cells/loopbackNode01Cell/application/)目录,为了描述方便我把前面的目录名称叫目录一,将后面的目录名称叫目录二。经过反复测试发现只有修改了目录二下面的web.xml文件并重启服务器后应用才会生效,目录一中的配置文件并不起作用,至此问题就解决了。
WAS中可以用很多种手段实现缓存。其中最常见的一种,就是在应用中使用开发的手段缓存一些中间结果。但这种缓存是一把双刃剑。用好了可以很好地提高性能,如果掌握不好,使用过度了,则会对底层JVM的Heap造成很大的威胁。一般JVMHeap出现OutOfMemery(内存泄漏)的问题,都是应用中直接或者间接的缓存技术滥用的后果。所以缓存技术拿捏得当非常重要,也比较不容易。
下面主要谈谈WAS产品本身提供的缓存功能。
WAS提供动态缓存机制,可以对Web命令、Servlet输出和JavaServerPages(JSP)文件进行高速缓存,从而提高应用程序的性能。动态高速缓存服务在应用服务器JVM中工作,拦截对可高速缓存对象的调用。例如,它通过servlet的service方法或命令执行方法拦截调用,以及将对象的输出存储到高速缓存,或者对来自于动态高速缓存的对象内容进行处理。
在WAS中可以通过配置实现常用的高速缓存对象、功能和模块有:
Servlet高速缓存
Portlet片段高速缓存
EdgeSideInclude高速缓存
Web命令高速缓存
WebService高速缓存
WebService客户机高速缓存
关于WAS的缓存功能,详细信息请参见:
http://publib.boulder.ibm.com/in.../welc6tech_dyn.html
对于WAS中的缓存机制,和应用开发中的缓存类似,也要掌握好缓存的“度”,避免滥用,即题目中问的“如何合理的使用”?原则有如下几点:
1.不是缓存用得越多越好。只要是WAS中提供了缓存机制的环节,统统都用上。这是错误的。
对于这一原则,有一个非常简单的方法可以确定是否采用缓存,采用哪些缓存技术:如果实现缓存本身相对于您的拓扑结构或者您所掌握的技术来说,显得非常的复杂,那么完全可以不用。举例来说,虽然EdgeComponent中提供了很好的缓存技术,但您的生产环境中,原本就没有考虑EdgeComponent,现在为了缓存而缓存,非要把EdgeComponent加进去,使得拓扑偏离了原先的设计,变得更复杂化,就很没有必要了。
2.确认您想缓存的对象是否真的需要缓存。这一点事先比较难以判断。因为生产环境真实的使用情况是千变万化的。最佳的方法就是在真实环境中对缓存进行监控,查看被缓存对象的命中率。如果某些缓存环节利用率极低,或者某个对象命中缓存的概率非常小,则完全可以取消这样的缓存。对于利用率高的缓存,可以在内存使用比较平稳的前提下适当增大力度。
websphere6配置文件缓存清除
http://blog.csdn.net/tiwen818/article/details/7019171