技术文章 2009-03-09 14:27:12 阅读189 评论0 字号:大中小 订阅
前几天在测试平台组开发的组件标签库时,发现一个奇怪的问题,有一些组件在每次刷新后都会重复出现。另外这个问题似乎与应用服务器有关,因为只有部署在tomcat(5.0,5.5)下会出现这种情况,而部署在weblogic(8.1)和websphere下都没有相关问题。将情况报告给平台组,很快就得到了回复,原来是tomcat的enablePooling参数在捣乱,这个参数用于控制应用服务器是否缓存自定义标签(即每次对标签渲染后是否调用release()方法进行释放操作),而且默认值是对标签进行缓存的。 tomcat4.1的开发者认为,tag的release()方法不是Java规范中必须实现的方法,所以仅在GC前调用。而且tomcat4.1默认开启了标签缓冲池(tag-pooling),因此执行完一次<tagPref:tag>标签之后并不会执行release()方法,所以会出现有些自定义组件在每次刷新后都重复出现的情况。而weblogic和websphere会在对标签渲染后调用release()方法,所以不会有标签重复渲染的问题。 这个问题可以通过设定tomcat的配置文件加以解决: 1.在%tomcat%/conf/web.xml加入enablePooling参数,并设置为false(不缓存自定义标签)。 =========================================== <servlet> <servlet-name>jsp</servlet-name> <servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class> <!--begin加入(请加为第一个参数)--> <init-param> <param-name>enablePooling</param-name> <param-value>false</param-value> </init-param> <!--end加入--> <init-param> <param-name>fork</param-name> <param-value>false</param-value> </init-param> </servlet> =========================================== 2.清空%tomcat%/conf/目录。 其他讨论: 1.enablePooling参数是4.1版本的新特征,也是和4.0版本的重大区别之一。 2.enablePooling参数的关闭可能会影响tomcat处理jsp的性能,但影响的程度未得到相关数据的量化。 3.要注意写好tag的释放方法,如果tag中存在内存泄漏,在enablePooling参数关闭的情况下,可能会在运行一段时间后大量消耗分配给tomcat的内存并引起tomcat响应速度缓慢。 http://mail-archives.apache.org/mod_mbox/tomcat-users/200312.mbox/%3C000101c3b85d$d4664f90$fd01a8c0@dell5100%3E