thcomm调用应该注意的一个问题
来源:互联网 发布:linux清空所有文件内容 编辑:程序博客网 时间:2024/06/10 23:26
最近的web应用中,HttpSession过多,会造成weblogic服务器内存溢出的现象发生。详细了解了一下程序,发现整个过程是无状态的,也就是说,整个程序中,没有session的创建的代码。那么,动不动就十几万的垃圾session是哪里来的呢?网上查了一下,恍然大悟,原来在访问jsp页面的时候,会默认创建session。大家都知道,jsp有内置的页面级变量session,我们可以直接拿来用,也就是说这个session的创建过程不是程序显式实现的,而是jsp的内在机制,由应用服务器实现的。
两个简单jsp页面,对比测试
1.默认的jsp页面
jsp源代码:
<%
out.println("Hello,world!");
%>
编译后的servlet代码:
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class test_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
private static java.util.Vector _jspx_dependants;
public java.util.List getDependants() {
return _jspx_dependants;
}
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
JspFactory _jspxFactory = null;
PageContext pageContext = null;
HttpSession session = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
try {
_jspxFactory = JspFactory.getDefaultFactory();
response.setContentType("text/html");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, true, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
session = pageContext.getSession();
out = pageContext.getOut();
_jspx_out = out;
out.println("Hello,world!");
} catch (Throwable t) {
if (!(t instanceof SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
out.clearBuffer();
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
}
} finally {
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
注意红色部分代码,就是session创建过程。
2.页面中禁用session的代码
jsp源代码:
<%@ page session="false" %>
<%
out.println("Hello,world!");
%>
编译后的servlet代码:
package org.apache.jsp;
import javax.servlet.*;
import javax.servlet.http.*;
import javax.servlet.jsp.*;
public final class test_jsp extends org.apache.jasper.runtime.HttpJspBase
implements org.apache.jasper.runtime.JspSourceDependent {
private static java.util.Vector _jspx_dependants;
public java.util.List getDependants() {
return _jspx_dependants;
}
public void _jspService(HttpServletRequest request, HttpServletResponse response)
throws java.io.IOException, ServletException {
JspFactory _jspxFactory = null;
PageContext pageContext = null;
ServletContext application = null;
ServletConfig config = null;
JspWriter out = null;
Object page = this;
JspWriter _jspx_out = null;
PageContext _jspx_page_context = null;
try {
_jspxFactory = JspFactory.getDefaultFactory();
response.setContentType("text/html");
pageContext = _jspxFactory.getPageContext(this, request, response,
null, false, 8192, true);
_jspx_page_context = pageContext;
application = pageContext.getServletContext();
config = pageContext.getServletConfig();
out = pageContext.getOut();
_jspx_out = out;
out.write('\r');
out.write('\n');
out.println("Hello,world!");
} catch (Throwable t) {
if (!(t instanceof SkipPageException)){
out = _jspx_out;
if (out != null && out.getBufferSize() != 0)
out.clearBuffer();
if (_jspx_page_context != null) _jspx_page_context.handlePageException(t);
}
} finally {
if (_jspxFactory != null) _jspxFactory.releasePageContext(_jspx_page_context);
}
}
}
很明显,少了上边红字部分代码。
ie7多窗口浏览器中测试
代码1测试结果:
同一个浏览实例中,代码1会创建session,但是刷新页面后,不新创建session。如果每次开新的浏览器实例访问该页面,每访问一次,新创建一个session。
代码2测试结果:
无论是同一个浏览器实例,还是新开浏览器访问,均不会创建session。
结论
这说明,jsp在默认状态下,当同一个浏览器实例访问时,因为浏览器向服务器端发送了cookie值,这样,服务器端创建一次session后,就不再创建。但是如果新开浏览器实例,因为cookie值不一样,服务器端就会新创建session。
thcomm的通信过程中,可能不会向服务器端发送cookie值,也就是说服务器对于每次的thcomm访问,都会认为是一个新的客户端的访问,那么jsp就会默认的创建一个session,这样在通信频繁的时候,会造成大量的垃圾session,增加了服务器的负担,浪费资源,严重情况下导致内存溢出。
所以,在使用jsp作为thcomm服务器端的时候,这是一个需要注意的问题。
- thcomm调用应该注意的一个问题
- 一个应该注意的问题
- Android 调用系统拍照的一些应该注意的问题
- Java开发向导页时应该注意的一个问题
- windows server 2012 VDI部署应该注意的一个问题
- 离职应该注意的问题
- 女生应该注意的问题
- 做外链应该注意的问题
- strcpy应该注意的问题
- 嵌入式应该注意的问题
- 一些应该注意的问题
- 显示调用DLL 应该注意DLL导出函数的调用约定问题
- 【android】在Service的onStartCommand()中调用stopself()应该注意的问题
- 作为一个程序员应该注意的地方
- 重写equals应该注意的一个细节
- c静态库被c++程序调用时应该注意的问题
- c静态库被c++程序调用时应该注意的问题
- Java的编程应该注意的问题
- 我与片片的n个约会
- 西行青藏新
- 利用ant进行项目发布
- Jocky混淆JAVA代码(保护你的JAVA项目)
- js页面缓存的一个解决办法
- thcomm调用应该注意的一个问题
- js实现验证码
- Debian中源代码方式安装Mysql+PHP+Nginx
- CGI入门学习
- Debian中实现nginx和spawn-fcgi开机启动
- Apache Mina 开发简介
- ubuntu10.04下vmware workstation破解安装
- Jdeis api使用redis有序集
- 一个很好的java反编译器