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

sunhq 03-09-21

我们也做了个论坛,环境是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 下一页