有关JavaBean中的资源释放问题,(熟悉jsp+JavaBean原理的高手请进)
6leaf 2001-12-31 11:20:50 请先看看下面源代码(很简单的,摘自小龙亭)。
那位大虾对Jsp+JavaBean的原理很清楚的,最好解析一下它们的工作原理,是如何创建实例的,各实例之间的关系,JavaBean在这里是以线程还是进程运行的?
(谁很好解决这个问题,我一定送分,分几次给都可以,反正我的分留着也没用,呵呵)
使用mydb.java制成的javabean
以下是mydb.java的源程序。
--mydb.java----------------------------
package mydb;
import java.sql.*;
public class mydb {
String sDBDriver = "sun.jdbc.odbc.JdbcOdbcDriver";
String sConnStr = "jdbc:odbc:sunshine";
Connection conn = null;
ResultSet rs = null;
public mydb() {
try {
Class.forName(sDBDriver);
}
catch(java.lang.ClassNotFoundException e) {
System.err.println("mydb(): " + e.getMessage());
}
}
public ResultSet executeQuery(String sql) {
rs = null; //
try {
conn = DriverManager.getConnection(sConnStr);
Statement stmt = conn.createStatement();
rs = stmt.executeQuery(sql);
}
catch(SQLException ex) {
System.err.println("aq.executeQuery: " + ex.getMessage());
}
return rs;
}
}
//-------------------------------------------------------
然后在Jsp页面中调用该JavaBean,源码如下
<%@ page language="java" import="java.sql.*" %>
<jsp:useBean id="RegisterBean" scope="page" class="mydb.mydb" />
<%
String sql="select * from user";
ResultSet rs = RegisterBean.executeQuery(sql);
if(rs.next()) {
rs.close();
RegisterBean.closeStmt();
}
%>
jsp页面中的rs已被关闭,但JavaBean中的rs并没有被显式关闭
我现在的问题就是,到底JavaBean中的rs是怎么处理的,从源代码看当JavaBean被调用后,并没有被关闭释放(只是关闭里jsp页面中的rs),这样长时间运转系统会不会出现问题,JavaBean中rs会不会不断积累而造成系统资源不足等。
注:我以前做个一个系统,用的数据库是Oracle,但不是用这种JavaBean方法实现的,曾遇到过这样的一个错误信息,系统运行一段时间后,说“....超出游标最大数!..”,当时为了赶进度,并没有很好解决这个问题,没有研究是什么原因造成的。
我想知道有没有必要在JavaBean中加一个释放rs的方法freeRS(),如:
public void freeRS() {
try {
if (rs != null) {
rs.close();
}
else {
return;
}
}
catch(SQLException e) {
return;
}
}
然后在jsp页面中显式调用该方法freeRS()释放javaBean中的rs呢?