天天看点

Oracle数据库,结果集已关闭(SQLException: Closed Resultset)

在制作BBS论坛的过程中,根据需要,我计划将数据库的访问、查询操作和查询结果分在两个函数中进行,即在数据库操作类DBAccess中有两个函数(错误代码):

private ResultSet executeQuery(String sql) throws SQLException {
		try{
			conn=ds.getConnection();		
			conn.setAutoCommit(false);
			stat=conn.createStatement(scrollType, concurType);
			rs=stat.executeQuery(sql);
			conn.commit();	
			return rs;	
		}finally {
		    if(stat!=null) {
			stat.close();
		    }
		    if (conn != null) {
		    	conn.close();
		    }
		} 		
	}
           
public String useRes(String...params) throws SQLException  {...}
           

前者负责查询,后者负责使用查询结果。

我在executeQuery()中使用finally块释放了数据库连接。我认为这里查询结果rs未被释放,所以我可以在useRes()中调用executeQuery()得到我想要的结果集,结果却出现了SQLException: Closed Resultset错误。经过研究,实际上当stat被关闭的时候,它所产生的rs也已经失效了,因此才会出现该错误。

解决方法很显然,要在使用完结果集后再关闭连接。即在useRes()中再使用finally释放数据库资源。当然,另一种做法是将结果集转化为List后再返回给调用函数使用,此方法我没有使用,这里就不解释了。