`
huangyuanmu
  • 浏览: 287212 次
  • 性别: Icon_minigender_1
  • 来自: 龙城
社区版块
存档分类
最新评论

thcomm调用应该注意的一个问题

阅读更多

最近的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服务器端的时候,这是一个需要注意的问题。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics