大家来看看,困惑了我很久的问题!

03-09-21 sunhq
我们也做了个论坛,环境是websphere 3.5,数据库是oracle,在sun的小型机上,程序是用jsp+bean做的,但运行一段时间发现任务管理器中的一个java.exe进程占用内存数不断增大,最开始只有50M,后来70M、100M这样一直增大,直到出现500错误,只好重启;我在网上查过很多资料,大部分说是打开数据库连接没有释放,但我在程序中很仔细的检查过,打开的连接肯定释放了

以下是程序的主要部分

1. bbs.java 取数据库中的记录存入Hashtable,Db是数据库的类

//取论坛列表

public java.util.Hashtable Getbbs() {

Hashtable ht = new Hashtable();

Db db = null;

Connection conn = null;

Statement stmt = null;

ResultSet rs = null;

int rec = 0;

String sql = "";

try {

//连接数据库

db = new Db();

conn = db.getConnection();

stmt = conn.createStatement();

sql = "select * from forum where ..."; //这里省略,主要是取数据库内容

//取详细内容

rs = stmt.executeQuery(sql);

rec = 0;

while (rs.next()) { //将信息存入集合

rec ++;

//取用户名称

ht.put("username" + rec, rs.getString("username"));

//取标题

ht.put("title" + rec, rs.getString("title"));

...

}

//关闭数据库连接

if(rs!=null) rs.close();

if(stmt!=null) stmt.close();

if(conn!=null) conn.close();

} catch (Exception e) {

ht.put("message", "对不起,暂无此类信息。");

//关闭数据库连接

try{

if(rs!=null) rs.close();

if(stmt!=null) stmt.close();

if(conn!=null) conn.close();

}

catch(Exception ee){}

return ht;

}

return ht;

}

2. jsp中显示标题

<%@ page import="java.util.*" %>

<jsp:useBean id="bbs" class="bbs.bbs" />

<html>

<head>

<title>论坛标题</title>

<body>

<%

Hashtable ht = bbs.Getbbs();

if(ht.containsKey("message")){ //如果取数据出错

out.print(ht.get("message"));

return;

}

else{ //列论坛标题

%>

<TABLE height="24" cellSpacing="1" cellPadding="1" width="99%" border="0" bgcolor="#ededed">

<TBODY>

<TR>

<TD>文章标题</TD>

<TD>作者</TD>

<TD>最新时间</TD>

<TD>点击</TD>

</TR>

<%for(int i=1;i<=bbs.getrec();i++) {%>

<TR>

<TD><%=ht.get("title" + i)%></TD>

<TD><%=ht.get("username" + i)%></TD>

<TD><%=ht.get("newtime" + i)%></TD>

<TD><%=ht.get("clicknum" + i)%></TD>

</TR>

<%}%>

</TBODY>

</TABLE>

<%}%>

</body>

</html>

以上程序是摘录的,不完整,肯定能正确执行,我开发的套路基本上是这样,bean到数据库中取数据,jsp中显示,我实在搞不明白,一般运行两天后websphere上的java占的内存就很大了,不得不重启,难道我占了内存没释放?java中不需要的吧,我实在没办法了,服务器现在过不了多久就要启动,大家看看该怎么办啊,到底是什么问题!谢谢

sunhq
2003-09-21 15:09
html标题不能显示,重发

我们也做了个论坛,环境是websphere 3.5,数据库是oracle,在sun的小型机上,程序是用jsp+bean做的,但运行一段时间发现任务管理器中的一个java.exe进程占用内存数不断增大,最开始只有50M,后来70M、100M这样一直增大,直到出现500错误,只好重启;我在网上查过很多资料,大部分说是打开数据库连接没有释放,但我在程序中很仔细的检查过,打开的连接肯定释放了

以下是程序的主要部分

1. bbs.java 取数据库中的记录存入Hashtable,Db是数据库的类

//取论坛列表

public java.util.Hashtable Getbbs() {

Hashtable ht = new Hashtable();

Db db = null;

Connection conn = null;

Statement stmt = null;

ResultSet rs = null;

int rec = 0;

String sql = "";

try {

//连接数据库

db = new Db();

conn = db.getConnection();

stmt = conn.createStatement();

sql = "select * from forum where ..."; //这里省略,主要是取数据库内容

//取详细内容

rs = stmt.executeQuery(sql);

rec = 0;

while (rs.next()) { //将信息存入集合

rec ++;

//取用户名称

ht.put("username" + rec, rs.getString("username"));

//取标题

ht.put("title" + rec, rs.getString("title"));

...

}

//关闭数据库连接

if(rs!=null) rs.close();

if(stmt!=null) stmt.close();

if(conn!=null) conn.close();

} catch (Exception e) {

ht.put("message", "对不起,暂无此类信息。");

//关闭数据库连接

try{

if(rs!=null) rs.close();

if(stmt!=null) stmt.close();

if(conn!=null) conn.close();

}

catch(Exception ee){}

return ht;

}

return ht;

}

2. jsp中显示标题

《%@ page import="java.util.*" %》

《jsp:useBean id="bbs" class="bbs.bbs" /》

《html》

《head》

《title》论坛标题《/title》

《body》

《%

Hashtable ht = bbs.Getbbs();

if(ht.containsKey("message")){ //如果取数据出错

out.print(ht.get("message"));

return;

}

else{ //列论坛标题

%》

《TABLE height="24" cellSpacing="1" cellPadding="1" width="99%" border="0" bgcolor="#ededed"》

《TBODY》

《TR》

《TD》文章标题《/TD》

《TD》作者《/TD》

《TD》最新时间《/TD》

《TD》点击《/TD》

《/TR》

《%for(int i=1;i《=bbs.getrec();i++) {%》

《TR》

《TD》《%=ht.get("title" + i)%》《/TD》

《TD》《%=ht.get("username" + i)%》《/TD》

《TD》《%=ht.get("newtime" + i)%》《/TD》

《TD》《%=ht.get("clicknum" + i)%》《/TD》

《/TR》

《%}%》

《/TBODY》

《/TABLE》

《%}%》

《/body》

《/html》

以上程序是摘录的,不完整,肯定能正确执行,我开发的套路基本上是这样,bean到数据库中取数据,jsp中显示,我实在搞不明白,一般运行两天后websphere上的java占的内存就很大了,不得不重启,难道我占了内存没释放?java中不需要的吧,我实在没办法了,服务器现在过不了多久就要启动,大家看看该怎么办啊,到底是什么问题!谢谢

banq
2003-09-21 18:33
典型内存泄漏,你可以使用Optimizate等工具查一下,这个问题在很多Jsp+bean模型中反复出现,是由于缺乏良好的设计造成的。

wys1978
2003-09-21 18:49
不一定是数据库连接没有关照常的,发生这样的问题的时候,检查一下数据库的连接情况。另外你的代码有一点小问题:

//关闭数据库连接

try{

if(rs!=null) rs.close();

if(stmt!=null) stmt.close();

if(conn!=null) conn.close();

}

catch(Exception ee){}

改写成

try{if(rs!=null) rs.close();}

catch(Exception ee){}

try{if(stmt!=null) stmt.close();}

catch(Exception ee){}

try{if(conn!=null) conn.close();}

catch(Exception ee){}

这样就能保证可以close connection

sunhq
2003-09-21 19:33
内存泄漏怎么检查啊,我学Java没多久,我为了测试,专门写了一个很简单的bean和jsp,bean中只取了一个很简单的数据,在jsp中显示,然后不断刷新jsp,发现内存还是增长,只不过增长的没那么快,我真的不明白了,bean和jsp都很简单,没几行代码,怎么还是不行啊

猜你喜欢
2Go 1 2 下一页