在JAVABEAN中就应该将数据封装进业务对象中。 你写的这个BEAN可以作为底层的通用数据库访问对象。 举个例子吧。 mydb<->user(entity)<->jsp(display user info) <->vector userlist(users)<->jsp(display user list) 不是严谨的,但是思路基本上是这样的。 因此CONNECTION和RECORDSET的资源问题就在底层就得到控制了。
use taglib,tag class invoke database access object and page tag get its output info by attribute.database objects manage all of the resources,create and release.
请问你是怎么看rs有没有关闭?
我用jdbc连sybase的时候,
是看网络连接数的,也就是connect的数量。
是不是有必要conn.close();
再用sessionBean 操作EntityBean,这样就不会有问题了
两个rs是不一样的!,不信你可以自己测试一下,我测试过了的。to:wind13(菩提树)
但我觉得运行jsp,JavaBean的容器好像不会马上收集的,好像等到服务停止才做回收处理,我现在就是不能确定这个问题,请看我原文,我曾碰到过的错误信息,“..超出最大游标数” ,怎么解释?to:skyyoung(路人甲)
我是说有没有必要,我当然知道可以那样做,当你有没有考虑到,每个jsp页面都要做这一步,无疑是增加的工作量。如果可以不加freeRS()管理就容易多了。to:hymmyh(羽)
我是用连接池来获得connection的,然后JavaBean调用连接池里的connection,使用完了就返还给连接池的,所以连接数上不用担心有问题。
现在问题焦点是JavaBean中的rs,是否需要显式关闭,服务器会不会自动管理我在JavaBean中没有显式关闭的rs(我现在用Tomcat做服务器),也就是说,如果会自动关闭的话,我就没有必要在javaBean中增加freeRS()做显式关闭rs了。大家请看看我的源码,我这里做了调试测试的
package DBTools;import java.io.*;
import java.sql.*;
import DBTools.PoolManager;public class ExecuteQueryBean { private ResultSet rs;
private Statement stmt;
private PoolManager poolMgr;
private Connection conn; public ExecuteQueryBean() {
poolMgr = PoolManager.getInstance();
} public ResultSet executeQry(String sql) {
rs = null;
try {
conn = poolMgr.getConnection("mysql");
stmt = conn.createStatement();
if (rs==null) {
System.out.println("");
System.out.println("\n\n[ "+ new java.util.Date()+" ] rs=null init now ! --------");
}
else {
System.out.println("");
System.out.println("[ "+new java.util.Date()+" ] rs!=null -----------------");
}
rs = stmt.executeQuery(sql);
stmt.close();
System.out.println("RS new A**************************");
poolMgr.freeConnection("mysql",conn);
}
catch (SQLException e) {
}
return rs;
//注意:这里并没有调用rs.close();
} public void freeRS() {
try {
if (rs != null) {
rs.close();
System.out.println("freeRS() ....RS CLOSE()~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
}
else {
System.out.println("freeRS()....rs ========================null");
}
}
catch(SQLException e) {
System.out.println("freeRS()....RS Close ERROR!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
}
}}
我是这样测试的,首先把Bean中的 rs 设定为static ,
然后在jsp页面(源码如下)中调用该bean,然后刷新或者反复调用该jsp页面
结果在输出的Debug信息:
RS new A**************************
[ Sun Dec 30 12:37:23 CST 2001 ] rs!=null -----------------
RS new A**************************
[ Sun Dec 30 12:37:51 CST 2001 ] rs!=null -----------------
RS new A**************************
[ Sun Dec 30 12:37:52 CST 2001 ] rs!=null -----------------
RS new A**************************
……
这样说名jsp里的rs.close()只是把jsp页面里的rs关闭了如果在jsp里加入显式调用的freeRS() 后,输出的Dubug信息如下:
[ Sun Dec 30 12:39:43 CST 2001 ] rs=null init now ! --------
RS new A**************************
[ Sun Dec 30 12:40:02 CST 2001 ] rs=null init now ! --------
RS new A**************************
[ Sun Dec 30 12:40:02 CST 2001 ] rs=null init now ! --------
……//---test.jsp -------------------------------------
<%@ page contentType="text/html; charset=GBK" %>
<%@ page language="java" import="java.sql.*" %>
<html>
<head>
<title>
test!
</title>
</head>
<jsp:useBean id="ExeQry" scope="page" class="DBTools.ExecuteQueryBean" />
<%
ResultSet rs = ExeQry.executeQry("select * from my_test_table");
%>
<body>
<h1>
<%
while (rs.next()) {
out.print("<h1>"+rs.getString("test_column")+"</h1>");
}
rs.close();
//ExeQry.freeRS();
%>
</h1>
</body>
</html>
你把rs设成static的,它自然不会是null(类的静态变量没那么快回收);
你写的这个BEAN可以作为底层的通用数据库访问对象。
举个例子吧。
mydb<->user(entity)<->jsp(display user info)
<->vector userlist(users)<->jsp(display user list)
不是严谨的,但是思路基本上是这样的。
因此CONNECTION和RECORDSET的资源问题就在底层就得到控制了。
根据我的观察,在javabean的生命周期结束后,finalize是一定会被自动调用的,那么我们可以将一些系统不能自动释放的资源放在finalize()方法中调用例如数据库连接、socket连接等
如:
public void finalize() throws Throwable{
rs.close();
conn.close();
super.finalize();}
立即释放rs的资源。to 6leaf: 真搞不懂,executeQry中第一行就是 rs=null; 那你后面再判断有什么用?
stmt关闭的时候自动关闭,所以除了发生异常要显式关闭外,不用考虑那么详细
俺觉得应该在bean里把rs封装到String数组里,然后在bean里关闭rs,返回String数组
rs=null 与 rs.close() 有什么区别?to gun4rose(gun4rose): 我在测试时把 rs=null那一行注释了的To ycats(加菲猫) :
stmt关闭的时候自动关闭,所以除了发生异常要显式关闭外,不用考虑那么详细 ”,我是不是可以不用管rs的释放了(当然释放是最好的,但现在是作补救工作时,可省就省点了,呵呵)