我写一个 服务器端的 数据库查询,结果出了问题:java.sql.SQLException:关闭的连接: next
首先,请看代码:/***
 *这是查询部分
 */
private ResultSet select(String flag ,int id , String name){
ResultSet rs = null ;
GetConnection getConn = new GetConnection();
Connection conn ;
Statement stat = null ;
String sql = null ;
if( null == flag ) flag = " * ";
if( id < 0 && null == name)sql = "select "+ flag + " from user_inf " ;
if( id >=0 && null == name)sql = "select "+ flag + " from user_inf where id = " + id ;
if( id < 0 && null != name)sql = "select "+ flag + " from user_inf where name = " + parseSqlDate(name) ;
if( id >=0 && null != name)sql = "select "+ flag + " from user_inf where id = " + id + " and name = " + parseSqlDate(name);
System.out.println(sql);
try{
conn = getConn.open();
stat = conn.createStatement();
rs = stat.executeQuery(sql);
r =rs ;
}
catch(Exception err){err.printStackTrace();}
finally{
try {
if( null!=stat || !stat.isClosed())
stat.close();

catch (SQLException e) {e.printStackTrace();}
getConn.close();
}
return r;
}
private ResultSet r = null ;//这是类变量 !
这是测试部分:package util.db;import java.sql.ResultSet;
import java.sql.SQLException;public class test {
public static void main(String[] args){
OperateUser_Inf o = new OperateUser_Inf();
ResultSet rs = o.findAll();
System.out.println(rs);
try {
while( rs.next()){
System.out.print(rs.getInt(1));
System.out.print(rs.getString(2));
System.out.print(rs.getString(3));
}
} catch (SQLException e) {
e.printStackTrace();
}finally{
try {
rs.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
}这是报错:java.sql.SQLException: 关闭的连接: next
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:111)
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145)
at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:180)
at util.db.test.main(test.java:12)注:Debug发现rs存在,不为bull !
错在 rs.next()。我不懂 ...... 

解决方案 »

  1.   

    你的代码:
            finally{
                try {
                    if( null!=stat || !stat.isClosed())
                        stat.close();
                } 
                catch (SQLException e) {e.printStackTrace();}
                getConn.close();
            }
    这句话应该是关闭数据库连接的吧?ResultSet是依赖Connection的,你执行next()的时候,它就要去数据库读取下一条记录。
      

  2.   

    如果在rs.next()之前关闭了Connection,会导致:
    java.sql.SQLException: 关闭的连接: next问题如果在rs.next()之前关闭了Statement或PreparedStatement,会导致:
    java.sql.SQLException: 关闭的语句: next如果在rs.next()之前关闭了ResultSet,会导致:
    java.sql.SQLException: 关闭的 Resultset: next
      

  3.   

    追问下:一般在什么时候才关闭数据库连接呢?或者说,数据库连接搞成固定个数的,一直保存在那里不关闭的?
    (to LZ:外层rs的关闭操作可别删了)
      

  4.   

    追问下:一般在什么时候才关闭数据库连接呢?或者说,数据库连接搞成固定个数的,一直保存在那里不关闭的?
    (to LZ:外层rs的关闭操作可别删了)我自己解决了,用一个List在ResultSet被close前接受它!新问题:
    直接定义 ArrayList a = new ArrayList();然后a.add(rs);没有丝毫问题,
    但是如果定义为 ArrayList<?> a = new ArrayList();就不能a.add(rs),也不能add()其他数据,为什么呢?我表示我泛型没学好
      

  5.   


    ——直白点说就是你用完数据了,就可以关闭。但是这样的话岂不是要把ResultSet和Connection满街传递?最后搞不好要JSP去负责关闭?——所以一般数据访问层封装都会把ResultSet转为VO值对象,土匪点就是:List<Map>如果我查出来的记录有100W条呢?——要分页吧哥们,执行查询SQL的时候就该考虑到分页了。如果我就是特别特别喜欢用ResultSet呢?——可以用CachedResultSet,它会主动把结果集从数据库next()出来,然后你就可以关闭Connection了;要注意分页哦~~~
      

  6.   


    ——直白点说就是你用完数据了,就可以关闭。但是这样的话岂不是要把ResultSet和Connection满街传递?最后搞不好要JSP去负责关闭?——所以一般数据访问层封装都会把ResultSet转为VO值对象,土匪点就是:List<Map>如果我查出来的记录有100W条呢?——要分页吧哥们,执行查询SQL的时候就该考虑到分页了。如果我就是特别特别喜欢用ResultSet呢?——可以用CachedResultSet,它会主动把结果集从数据库next()出来,然后你就可以关闭Connection了;要注意分页哦~~~
    学习了~
    (霸占2012全年java月专家排行第一,牛掰~)
      

  7.   


    ——直白点说就是你用完数据了,就可以关闭。但是这样的话岂不是要把ResultSet和Connection满街传递?最后搞不好要JSP去负责关闭?——所以一般数据访问层封装都会把ResultSet转为VO值对象,土匪点就是:List<Map>如果我查出来的记录有100W条呢?——要分页吧哥们,执行查询SQL的时候就该考虑到分页了。如果我就是特别特别喜欢用ResultSet呢?——可以用CachedResultSet,它会主动把结果集从数据库next()出来,然后你就可以关闭Connection了;要注意分页哦~~~学习了 !!!