`
huangyuanmu
  • 浏览: 290477 次
  • 性别: 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服务器端的时候,这是一个需要注意的问题。

分享到:
评论

相关推荐

    C#中在一个窗体里调用另一个窗体的方法

    在C#中,窗体之间的方法调用是一个常见的需求,特别是在复杂的桌面应用程序设计中。本文将根据提供的标题、描述、标签以及部分内容,详细介绍如何在C#的一个窗体中调用另一个窗体的方法,并探讨其中涉及的技术细节。...

    在一个类中调用另一个类的数据成员的方法-程序实现

    本文将详细讲解如何在一个类中调用另一个类的数据成员,包括两种主要的方法:对象引用和友元函数。这两种方法都有其特定的应用场景和优缺点,开发者应根据实际需求选择合适的方式。 ### 1. 对象引用 对象引用是一...

    调用CPLEX求解优化问题的简化方法

    调用CPLEX求解优化问题的简化方法调用CPLEX求解优化问题的简化方法

    使用JNA替代JNI调用DLL,并解决内存溢出问题

    为了解决上述问题,一种常见的策略是请求C++团队编写一个DLL文件来负责解析二进制数据,然后Java应用通过调用该DLL来获取解析后的结果,通常是以JSON格式返回。这就涉及到如何在Java中调用DLL的问题。 #### 方案...

    网页调用OCX 和 调用OCX的接口函数

    假设OCX有一个名为`ExecuteProcess`的接口函数,可以这样调用: ```javascript var ocx = document.getElementById('myOCX'); if (ocx) { ocx.ExecuteProcess('参数'); } ``` 这里的`ExecuteProcess`是OCX控件提供...

    java用JNA调用dll实例,包含各种参数调用

    Java Native Access(JNA)是Java平台上的一个开源库,它提供了直接调用系统DLL函数的能力,无需编写C代码或者使用JNI(Java Native Interface)。本实例将深入探讨如何使用JNA调用DLL,并涵盖了各种参数类型,包括...

    VC++调用大漠插件

    "VC++调用大漠插件"就是这样一个主题,它涉及到C++编程、Windows API编程以及多线程技术,主要目标是通过Visual C++(VC++)环境,有效地调用大漠插件以实现特定功能。 大漠插件是由国内开发者制作的一系列功能强大...

    Dll调用与嵌套调用

    //本文所有的例子只有一个sum即加法函数。 2.使用方法:  (1).隐式调用法: 将MyDll.lib和MyDll.h拷贝到需要应用该DLL的工程的目录下,将MyDll.dll拷贝到产生的应用程序的目录下,并在需要应用该DLL中的函数的CPP...

    chrome 调用本地exe

    注,chrome 通过注册表注册表 只能调用本地的 exe 或者bat文件,不能调用 ppt word 这样的问题,所以我用VB 写了一个exe 可以接收调用参数,这样只许注册一次就可以通过传参打开所有课执行文件了 由于1.exe是后台...

    C++ 包含类两个类互相调用彼此的类成员变量和方法

    在C++编程中,类之间的相互调用是一个常见的设计模式,尤其在实现复杂系统或对象间的协作时。这种设计允许类A访问类B的成员,同时类B也可以访问类A的成员,形成一种循环依赖的关系。然而,这种关系需要谨慎处理,以...

    QT调用dll和MFC调用QT的dll

    - 创建DLL:首先,你需要在QT环境中创建一个DLL项目,定义必要的接口和实现。在`Q_DECL_EXPORT`和`Q_DECL_IMPORT`宏的帮助下,可以正确处理导入和导出符号。 - 导入DLL:在主QT项目中,通过`LoadLibrary`和`...

    java中两种方式调用其他.exe可执行程序

    `Desktop` 类提供了一个简洁的方式来打开其他.exe 可执行程序,而 `Runtime` 类提供了一个更加灵活的方式来执行外部命令。两种方式都可以用来实现调用其他.exe 可执行程序的功能,但它们的使用场景和方式有所不同。 ...

    C++调用C#的DLL实例程序

    1. 创建C# DLL:在C#项目中定义一个公共类,包含需要调用的方法。例如,可以有一个名为`Calculator`的类,其中有一个`Add`方法用于加法运算。确保将类和方法设置为公共的(`public`),并且将类库项目配置为生成DLL...

    c#调用微信扫一扫及其他功能,包含自己写的微信帮助类.cs

    在`wxHelper.cs`中,可能有一个`ScanQRCode()`方法,它通过调用微信提供的API生成一个扫描二维码的任务,用户扫描后,微信服务器会返回扫描结果,再由应用进行后续处理。 此外,`调用微信功能.txt`文件可能是对如何...

    SQLServer存储过程调用WebService

    在 SQL Server 中,可以通过创建一个扩展存储过程来调用 Web Service。具体步骤如下: 1. **定义 WebService 类型**:首先,需要定义一个 WebService 类型,用于存储 Web Service 的 URL 和操作信息。 2. **编写...

    C#动态调用类方法

    1.动态调用类方法,模拟VB中的CallByName 2.附带了C#和VB的代码 3.主要是一个项目中用到了要调用很多参数和返回值相同的一系列函数,所以 想到了这个方法,不用重复的写方法名,使用循环调用

    LabVIEW静态和动态调用子VI经典示例

    - 调用子VI.llb:这是一个库文件,包含了多个子VI的集合,可以在项目中直接引用这些子VI。 - 动态调用子VI.lvlps:这是LabVIEW的项目文件,包含了项目的配置信息,如子VI、路径等。 - 动态调用子VI.lvproj:LabVIEW...

    delphi调用C# DLL

    接下来,我们将详细讲解如何使用C#创建一个可以被Delphi调用的DLL组件。 1. **创建.NET DLL项目**: - 打开Visual Studio,创建一个新的C#类库项目(例如命名为`TestDll`)。 - 添加必要的命名空间引用,如`...

    c#调用c++ dll 传参 string 崩溃的一种解决办法

    一个常见的场景是C#调用C++编写的动态链接库(DLL)。然而,在这种情况下可能会遇到一些问题,比如当向C++ DLL传递字符串参数时程序崩溃的情况。本文将详细探讨这一问题,并提供一种可能的解决方案。 #### 问题背景...

    PB6,PB7,PB8,PB9,PB10,PB11调用WEBSERVICE,并解决超时问题

    描述中提到的“AXIS2”是Apache软件基金会的一个开源Web服务框架,它用于部署和实现Web服务。AXIS2提供了高效的执行模型,支持多种协议(如SOAP、REST)和数据绑定技术。 “VB”可能是指Visual Basic,这是...

Global site tag (gtag.js) - Google Analytics