当前位置: 首页 > 图文教程 > 网络编程 > JSP > weblogic的jsp问题解决方法

JSP
搭建Eclipse+MyEclipse开发环境
卖jsp编程技巧的那个垃圾的所有实例的答案全部已收集,现将他人收集的实例答案公布出来,大家鉴赏!
一个jsp+AJAX评论系统
JSP 多个文件打包下载代码
JSP 动态树的实现
jsp 重复提交问题
J2ME/J2EE实现用户登录交互 实现代码
访问JSP文件或者Servlet文件时提示下载的解决方法
JSP EL表达式详细介绍
JSP 报表打印的一种简单解决方案
jsp 自定义标签实例
AJAX自学练习 无刷新从数据库后台取数据显示
AJAX 自学练习 请求与显示
AJAX 自学练习 无刷新提交并修改数据库数据并显示
jsp 文件上传浏览,支持ie6,ie7,ie8
JSP application(return String)用法详例
jsp form表单方法示例
JSP request(return String)用法详例
JSP forward用法分析实例代码分析
JSP JavaBean的setProperty属性

JSP 中的 weblogic的jsp问题解决方法


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-28   浏览: 72 ::
收藏到网摘: n/a

在做项目的时候,jsp在运行的时候出现了一些问题,现将我的问题解决方法做一个小结,供以后作项目的参考。

问题1:
weblogic 的数据库连接数目在程序运行中不断增长,最后连接数目超过最大数,导致weblogic服务关闭
原因:
在操作完数据库后,没有关闭数据库连接;或者是返回结果集(Resultset),而无法在jsp中关闭数据库连接。
解决方法:
1.    在操作完数据库要关闭数据库连接。
2.    尽量不要返回结果集Resultset, 可以返回Vector(一个字段)、Hashtable(多个字段),这样可以在javabean中关闭数据库。
3.    如果javabean中返回的是结果集(Resultset),也可以在javaBean中写一个connectDB(连接数据库)、closeDB(关闭数据库)的方法,然后jsp里面调用connectDB(),建立数据库连接,同时就可以对数据库进行操作了,操作数据库完毕,可以通过closeDB() 来关闭数据库。
使用第二种方法
问题2:
在运行某一个jsp 程序的时候,weblogic 的内存陡然增长,而且居高不下。最终导致weblogic 内存不足,甚至当机。
原因:
过度使用内存。
解决方法:
1.    由于数据量比较大,在对字符串进行操作的时候,使用 + 进行字符串连接,而
   相信大家对String都非常熟悉,我们也经常要用它来做字符串的连接什么的,例如:
String a =b+c file://b,c 都是String
但是在实际的编译中却是这样:
String a=new StringBuffer().append(b).append(c).toString() 显然,在一个简单的语句中却意外的多生成了2个对象:
.StringBuffer()
.toString返回的一个String
我们比较一下这两段程序的性能:
程序片断一:
StringBuffer s=new StringBuffer();
long start = System.currentTimeMillis();
for (int i=0;i<10000;i++){
s1+="a";
}
long stop = System.currentTimeMillis();
System.out.println(stop-start);
程序片断二:
StringBuffer s=new StringBuffer(10000);//
long start=System.currentTimeMillis();
for (int i=0;i<10000;i++){
s.append("a");
}
long stop=System.currentTimeMillis();
System.out.println(stop-start);
比较一下结果,差距很明显。
至于为什么String的连接这么做,因为String无法直接改变其长度,而必须采用StringBuffer的用法。
因此建议使用StringBuffer 的append 方法来进行字符串相连。
2.    在解决这个问题的时候,我也尝试使用上面的方法,效果并不是很明显(消耗内存上)。后来在显示大量数据的时候,避免字符串相连的步骤,而直接使用out.println(),直接输出。
问题3:Java并不阻止程序占用过多的内存,当对象向堆所请求的内存不足时,垃圾收集器(Garbage Collector)就会自动启动,释放那些引用数为零的对象所占用的内存,Java也不会自动释放无用的对象的引用,如果程序忘记释放指向对象的引用,则程序运行时的内存随着时间的推移而增加,发生所谓内存泄漏(memory leaks),创建对象不但消耗CPU的时间和内存,同时,为释放对象内存JVM需不停地启动垃圾收集器(Garbage Collector),这也会消耗大量的CPU时间。
    
解决方法: 由于在运行一段时间jsp程序后,weblogic 的内存会有一个缓慢的增长,这样也会导致内存溢出,为了避免这总现象的出现,最终的解决方法是: 编写一个servlet程序,在启动服务器的时候,启动一个这个servlet,每隔20分钟运行在服务器端运行一次,来定时回收内存。
 问题4:
log文件里面的调试信息没有注释去掉。
 解决方法:
在程序通过后,尽量把调试的信息注释去掉。
同时在捕捉错误的时候要写明程序名称,方便查找,这一点做的还不够。
最好能写一个记录log的方法,以便程序调用。
问题5
改善性能,提高速度。
具体实例:
 我们再来看一个有关Vector类的代码片段:
for(int I=0; I如果v包含100,000个元素,这个代码片段将调用v.size()方法100,000次。虽然size方法是一个简单的方法,但它仍旧需要一次方法调用的开销,至少JVM需要为它配置以及清除堆栈环境。在这里,for循环内部的代码不会以任何方式修改Vector类型对象v的大小,因此上面的代码最好改写成下面这种形式:
int size = v.size(); for(int I=0; I虽然这是一个简单的改动,但它仍旧赢得了性能。毕竟,每一个CPU周期都是宝贵的。
问题 6:
在 jsp 文件里面 不要写
因为java 不需要引入此包就可以引用里面的类文件。

问题7:
使用vector+hashtable 一次返回查询结果resulset.

解决方法: 记录集:将一条记录放到一个hashtable里面,然后把它再
       添加到vector里面,循环记录下结果集,返回vector
具体见后面的java文件的部分代码(不包扩数据库的连接和关闭)


 package zjdx.bean.common;

/********************************************
 ***** Title:      hashtable_vector_rs 
 ***** Description: 数据显示          
 ***** Copyright:  Copyright (c) 2002  
 ***** Company:       DHC           
 ***** author:     wangyl              
 ***** version:    1.0                 
 ***** 说明:
 ***** 记录集:一条记录用放到一个hashtable里面,然后把它再
       放到vector里面,循环记录下结果集,返回vector
      
*********************************************/

import java.io.*;
import java.sql.*;
import java.util.*;
import java.text.*;

public class hashtable_vector_rs
{
    /*----------------------------------------------------------------*/
    /* 函数名称: getMultiRowInfo
    /* 功能描述: 返回记录集,放到Hashtable里面
    /* 参数:    sql 语句,字段个数
    /* 返回值:   成功---htable, 失败---null
    /*----------------------------------------------------------------*/
    public Vector ListResult(String sqlStatement,int num)
    {
        Vector ListRs=new Vector();
       
        try
        {
            connectDB();
            rs=stmt.executeQuery(sqlStatement);
            //判断字段数据类型
            //date型 返回 93
            //int型 返回 2,4
            //bigint型 返回 3
            //String型 返回 12
            //(char 型)返回 1
            int t = -1;
            rsmd = rs.getMetaData();
            int ColumnCount=0;
            if(num>0)
                ColumnCount = num;
            else
                ColumnCount = rsmd.getColumnCount();
            while(rs.next())
            {                            
                Hashtable htable =new Hashtable();
                for (int i = 1; i <= ColumnCount; i++)
                {
                    t=rsmd.getColumnType(i);
                    System.out.println("i="+i+",t="+t+"name="+rsmd.getColumnName(i));
                    if(t==12||t==1||t==3)
                    {
                        if(rs.getString(i)==null|| rs.getString(i).equals(""))
                            htable.put(rsmd.getColumnName(i),"");
                        else
                            htable.put(rsmd.getColumnName(i),rs.getString(i));
                    }
                    else if(t==93)
                    {
                        htable.put(rsmd.getColumnName(i),rs.getDate(i).toString());
                    }
                    else if(t==2||t==4)
                    {
                        htable.put(rsmd.getColumnName(i),Integer.toString(rs.getInt(i)));
                    }
                }
                ListRs.add(htable);
            }//e
            return ListRs;               
        }
        catch(Exception listError)
        {
            System.out.println("数据库操作失败!"+listError);
            return null;
        }
        finally
        {
            try
            {
                closeDB();
            }   
            catch(Exception closeErr)
            {
                System.out.println("关闭数据库出错:"+closeErr);   
            }
        }    
    }
}

 问题8: jsp的程序也有设计的不够合理的地方
     例如:选择一个下拉框,提交一次,列出所选的数据,选择另外一个下拉框再次提交,再次列出所选的数据。
解决方法:
     尽量一次把条件选择完毕,然后列出所选择的数据,并且在数据多的时候,尽量使用翻页,减少运行时间。

问题9:性能优化,尽量使用PreparedStatement
解决方法:
PreparedStatement 对象和使用的普通的 Statement 对象有两点不同。
第一,    它们是为了性能更快而由 JDBC 驱动程序或数据库编译(预编译)的。
第二,    它们接受一个或多个动态输入参数,称为 IN 参数。这两点让 PreparedStatement 对象适用于重复的 SQL 操作,其中操作基本上都是一样的,只有微小的差异(如数据载入)。要让 SQL 语句在使用前预备好,在 PreparedStatement 对象创建时必须将 SQL 传送到 JDBC 驱动程序,而不是在其执行时才传送。

IN 参数用 SQL String 中的 ? 占位符表示。在 PreparedStatement 能够成功地执行前,还必须调用 PreparedStatement 对象的 setXXX() 方法来设置 IN 参数,在这里 XXX 被设置的参数的数据类型所替换。因而,要将第一个 IN 参数设置为整数值 100,您应该调用 setInt(1, 100)。同样地,要将第二个 IN 参数设置为字符串值“rjb”,您应该调用 setString(2, "rjb")。最后一点是,设置好的参数值在设置为一个新的值,或用 clearParameters() 显式地清除之前会保持不变。这很重要,因为 PreparedStatement 可以被多次执行;如果您不注意的话,就会让您的数据库充满无用数据。
问题10 :
  1、我把包含SQLBridge 的java文件改了一遍,有32个java文件(已经改完)。
   2、我把包含SQLPool 的java文件改了一遍,有27个java文件(已经改完)。
   3、我把不用的jsp文件整理了一下,大概有17 个目录的jsp文件不用或者没有上线。(整理完毕)
问题11:提交页面,每次都提交两次。
原因:
  1、

这里如果type=”sbumit”,页面就会提交两次。(花费了一天的时间才找到原因)。
在onclick事件里面会提交一次,而submit 按钮本身也会提交一次。

解决方法:
   如果在onclick 事件里面提交页面,按钮的类型type 一定不可以是”submit”  按钮。
可以是”button”.
   全文搜索共有33个类似的文件。
java.net.SocketException: ReadFile failed: 指定的网络名不再可用。
主要是由于这个引起的。
问题12:定时刷新页面,600秒(不是必要的,不要这样做)
原因:
  
解决方法:
       去掉这样的语句。
   
全文搜索共有12个类似的文件。

问题13:在跳转到别的页面的时候,要加return。
否则可能会引起错误。跳转不过去。
If{
request.getRequestDispatcher("/zjdx/jsp/common/ErrorPage.jsp?s_mark=error:record have existed").forward(request,response);
return;
}
else
{
response.sendRedirect();
//建议用上面的方法
return;
}