当前位置: 技术问答>java相关
有关JavaBean中的资源释放问题,(熟悉jsp+JavaBean原理的高手请进)
来源: 互联网 发布时间:2015-03-14
本文导语: 请先看看下面源代码(很简单的,摘自小龙亭)。 那位大虾对Jsp+JavaBean的原理很清楚的,最好解析一下它们的工作原理,是如何创建实例的,各实例之间的关系,JavaBean在这里是以线程还是进程运行的? (谁很好解...
请先看看下面源代码(很简单的,摘自小龙亭)。
那位大虾对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,源码如下
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呢?
那位大虾对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,源码如下
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呢?
|
关闭结果集与关闭连接不同。关闭结果集事释放在数据库申请的游标等资源。
|
所以加菲猫说的对,两个rs其实是一样的,再者根据javadoc的介绍,rs可以在
stmt关闭的时候自动关闭,所以除了发生异常要显式关闭外,不用考虑那么详细
stmt关闭的时候自动关闭,所以除了发生异常要显式关闭外,不用考虑那么详细
|
Java提供了一个名为finalize()的方法,可为我们的类定义它。在理想情况下,它的工作原理应该是这样的:一旦垃圾收集器准备好释放对象占用的存储空间,它首先调用finalize(),而且只有在下一次垃圾收集过程中,才会真正回收对象的内存。所以如果使用finalize(),就可以在垃圾收集期间进行一些重要的清除或清扫工作。
根据我的观察,在javabean的生命周期结束后,finalize是一定会被自动调用的,那么我们可以将一些系统不能自动释放的资源放在finalize()方法中调用例如数据库连接、socket连接等
如:
public void finalize() throws Throwable{
rs.close();
conn.close();
super.finalize();
}
根据我的观察,在javabean的生命周期结束后,finalize是一定会被自动调用的,那么我们可以将一些系统不能自动释放的资源放在finalize()方法中调用例如数据库连接、socket连接等
如:
public void finalize() throws Throwable{
rs.close();
conn.close();
super.finalize();
}
|
在JAVABEAN中就应该将数据封装进业务对象中。
你写的这个BEAN可以作为底层的通用数据库访问对象。
举个例子吧。
mydbuser(entity)jsp(display user info)
vector userlist(users)jsp(display user list)
不是严谨的,但是思路基本上是这样的。
因此CONNECTION和RECORDSET的资源问题就在底层就得到控制了。
你写的这个BEAN可以作为底层的通用数据库访问对象。
举个例子吧。
mydbuser(entity)jsp(display user info)
vector userlist(users)jsp(display user list)
不是严谨的,但是思路基本上是这样的。
因此CONNECTION和RECORDSET的资源问题就在底层就得到控制了。