问个有关JDBC,ResultSet对像多次使用后再关闭的问题,困扰许久,望各位指点明津,谢谢

问题描述

//代码...ResultSet rs = this.conn.prepareStatement("select * from test1").executeQuery(); //注sql语句不同while(rs.next()){  ...}rs = this.conn.prepareStatement("select * from test2").executeQuery(); //注sql语句不同while(rs.next()){  ...}rs = this.conn.prepareStatement("select * from test3").executeQuery(); //注sql语句不同while(rs.next()){  ...}...rs.getStatement().close();//疑问1:多次使用rs对象后,我在最后关闭一次,这样有没有问题?还是要每次用完都关闭(如上代码要关3次rs?)//疑问2:使用rs.getStatement().close();关闭前,有没有必要先使用rs.close();关闭,每次都是吗(如上代码要关3次rs?)?

解决方案

正常情况下如果使用Statement执行完一个查询,又去执行另一个查询时这时候第一个查询的结果集就会被关闭,也就是说,所有的Statement的查询对应的结果集是一个,如果调用Connection的commit()方法也会关闭结果集。可保持性就是指当ResultSet的结果被提交时,是被关闭还是不被关闭。JDBC2.0和1.0提供的都是提交后ResultSet就会被关闭。不过在JDBC3.0中,我们可以设置ResultSet是否关闭。要完成这样的ResultSet的对象的创建,要使用的Statement的创建要具有三个参数,这个Statement的创建方式也就是,我所说的Statement的第三种创建方式。如下:Statement st=createStatement(int resultsetscrollable,int resultsetupdateable,int resultsetSetHoldability)ResultSet rs = st.excuteQuery(sqlStr);前两个参数和两个参数的createStatement方法中的参数是完全相同的,这里只介绍第三个参数: resultSetHoldability表示在结果集提交后结果集是否打开,取值有两个: ResultSet.HOLD_CURSORS_OVER_COMMIT:表示修改提交时,不关闭数据库。 ResultSet.CLOSE_CURSORS_AT_COMMIT:表示修改提交时ResultSet关闭。
解决方案二:
所以对于你的疑问要看具体的情况,一般情况下是没错的,不过为了便于阅读和理解程序,我们习惯还是最好关闭,如果是多个记录集最好是对应多个Statement
解决方案三:
引用每次用完都关闭的话,它会立即释放此 ResultSet 对象的数据库和 JDBC 资源 如果在最后关闭的话,只是释放了最后这次查询的ResultSet,JDBC 资源. 如果不关闭的话,就会等待该对象自动关闭时(垃圾收集)发生释放此 ResultSet 对象的数据库和 JDBC 资源此操作。 rs.getStatement().close();自动导致ResultSet对象无效 注意只是ResultSet对象无效,ResultSet所占用的资源可能还没有释放,所有最好还是调有rs.close() 不执行ResultSet的close可能会导致更多的资源泄露 SUN: An application calls the method Statement.close to indicate that it has finished processing a statement. All Statement objects will be closed when the connection that created them is closed. However, it is good coding practice for applications to close statements as soon as they have finished processing them. This allows any external resources that the statement is using to be released immediately. Closing a Statement object will close and invalidate any instances of ResultSet produced by that Statement object. The resources held by the ResultSet object may not be released until garbage collection runs again, so it is a good practice to explicitly close ResultSet objects when they are no longer needed. These comments about closing Statement objects apply to PreparedStatement and CallableStatement objects as well.上面这位老兄说的我有点不赞同,我们可以写一个程序来测试一下,rs=stmt.executeQuery("select * from test1 ");rs2=stmt.executeQuery("select * from test2 ");while(rs2.next()){System.out.println(rs2.getString(1));System.out.println(rs2.getString(2));}while(rs.next()){System.out.println(rs.getString(1));System.out.println(rs.getString(2));}前面和后面我都不写了,假如你用这个测试的,会直接报Operation not allowed after ResultSet closed,那从这个异常我们就可以看出,在你进行操作的时候,你前一个rs已经被自动关闭了,所以说是“正常情况下如果使用Statement执行完一个查询,又去执行另一个查询时这时候第一个查询的结果集就会被关闭”
解决方案四:
每次用完都关闭的话,它会立即释放此 ResultSet 对象的数据库和 JDBC 资源如果在最后关闭的话,只是释放了最后这次查询的ResultSet,JDBC 资源.如果不关闭的话,就会等待该对象自动关闭时(垃圾收集)发生释放此 ResultSet 对象的数据库和 JDBC 资源此操作。 rs.getStatement().close();自动导致ResultSet对象无效 注意只是ResultSet对象无效,ResultSet所占用的资源可能还没有释放,所有最好还是调有rs.close()不执行ResultSet的close可能会导致更多的资源泄露 SUN:An application calls the method Statement.close to indicate that it has finished processing a statement. All Statement objects will be closed when the connection that created them is closed. However, it is good coding practice for applications to close statements as soon as they have finished processing them. This allows any external resources that the statement is using to be released immediately. Closing a Statement object will close and invalidate any instances of ResultSet produced by that Statement object. The resources held by the ResultSet object may not be released until garbage collection runs again, so it is a good practice to explicitly close ResultSet objects when they are no longer needed. These comments about closing Statement objects apply to PreparedStatement and CallableStatement objects as well.

时间: 2024-10-31 21:29:25

问个有关JDBC,ResultSet对像多次使用后再关闭的问题,困扰许久,望各位指点明津,谢谢的相关文章

后台登录程序-无法解析导入 com.mysql.jdbc.ResultSet

问题描述 无法解析导入 com.mysql.jdbc.ResultSet 新手调试一个网站后台登录程序,可是出现如图1的问题,请各位大神指导下,我已经加载了jre的包额 解决方案 直接用这个包吧,这是jdk1.6的,java.sql.ResultSet 解决方案二: 错误果然没有了.谢谢哈 解决方案三: 如果对了麻烦采纳下哦. 解决方案四: 你导入了两个jar包,导致编译器无法选择,所以报了错误

java myecl...-jdbc resultSet.next() watch的时候是否会自己运算一次

问题描述 jdbc resultSet.next() watch的时候是否会自己运算一次 请教一个问题,我在myeclipse中watch了 resultSet.next()这个表达式,同学说这样调试会出问题,因为eclipse会先在watch里计算一次 resultSet.next()这个表达式,然后再回到程序中,也就是说watch中的这个 resultSet.next()会跑一次,跑完以后再到程序中跑,因此会改变 resultSet.next()的值.我觉得有点不可思议,因为我一直以为wat

tcexam安装-求问在安装tcexam时候,在install页面安装后出现了三行warning:rename怎么办

问题描述 求问在安装tcexam时候,在install页面安装后出现了三行warning:rename怎么办 如图这样怎么解决啊,求大神指导,而且localhosttcexam页面也打不开,显示404错误 解决方案

sql-求问大神SQL,如何关联两张表后,将第二张表的数据插入第一张表数据第一行后面(详细内容在图片中)

问题描述 求问大神SQL,如何关联两张表后,将第二张表的数据插入第一张表数据第一行后面(详细内容在图片中) 刚注册,无法悬赏,求答案啊~~~~(>_<)~~~~ 解决方案 以前写的SQLServer和Oracle两张表一一对应的SQLhttp://blog.csdn.net/danielinbiti/article/details/43231879 解决方案二: insert into 表1(订单编号,SKU)select 订单编号,订单退款 from 表2

ceph-请问对Ceph源代码的改动在重新编译安装后为何无法体现出来?

问题描述 请问对Ceph源代码的改动在重新编译安装后为何无法体现出来? 请懂Ceph的大神们帮帮忙: 我们实验室在做一个跟Ceph相关的项目,在Ubuntu 12.04的环境下,发现对于源代码的改动在重新编译安装后跟没改动一样... 具体: 在Client.cc的7988行,也就是在 client::_create() _函数中,将正在创建的文件名name赋给一个新的变量name2并对name2进行随意修改(例如尾部增加一个字符串),并且在该函数中后面引用name的地方都换成name2.然而,重

关于ResultSet的问题,高手请进!!

问题描述 我的环境是java6.DB2v9.5链接DB采用type4.比如说我的ResultSet里有一条数据.resultset.next();这时指针指向第一条.resultset.next();这时应该返回false;问题点:我在执行:resultset.next();这时就报resutlsetclosed异常.这是怎么回事?在链接DB采用type2时就没有错误. 解决方案 解决方案二:next()前用hasnext()判断一下嘛解决方案三:LZ,两句.next()之间的代码是什么呢?解决

连接池满-在界面上连续按F5刷新Tomcat报错,显示连接池已满

问题描述 在界面上连续按F5刷新Tomcat报错,显示连接池已满 错误信息:org.apache.tomcat.dbcp.dbcp.SQLNestedException: Cannot get a connection pool error Timeout waiting for idle objectTomcat与数据库使用连接池,封装在一个类里面:public class BaseDAO { private Connection conn = null;private ResultSet r

java.sql.Connection类中有个方法

问题描述 java.sql.Connection类中有个方法 PreparedStatement prepareStatement(String sql, String[] columnNames) throws SQLException 这个方法中参数的第二个作用是什么,代表什么意思? 下面是org.springframework.jdbc.core.PreparedStatementCreatorFactory中的一段代码 [code=java] public PreparedStateme

要不要关闭Connection对象,为什么

问题描述 我写了一个类 封装了MySQL数据库的连接方法,一个是用类方法实现,一个是用对象方法实现,如下:public static Connection getConn() throws Exception{Connection conn=null;try{Class.forName(strDataDriverName);} catch (ClassNotFoundException e) {// TODO: handle exceptionthrow new Exception(e);}tr