Tomcat下自定义标签重复渲染问题
技术文章 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
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