现用jdbc执行一存储过程,该存储过程为一查询,返回查询结果。
 
现在返回ResultSet结果集之前,关闭了Statement。如下:
 
ResultSet rs = (ResultSet) cst.getObject(count + 1);
 
cst.close(); //cst为CallableStatement
 
// while(rs.next()){...}
 
return rs;
 
然后操作rs获取数据。
 
现遇到问题如下:
 
该查询操作,在web请求查询调用时正常。但通过main方法调用该查询时报错。java.sql.SQLRecoverableException。
 
断点到cst.close()后加入rs的操作,发现main方法调用时,rs操作无效,而通过web请求调用时正常。
 
web请求调用和main方法调用有什么区别?

解决方案 »

  1.   

    元芳,CSDN新论坛上线!你怎么看?
      

  2.   

    在解析ResultSet之前,是不能关闭Statement的!
    所以在这个时候,我们引入了实体(entity),在得到ResultSet之后,我们首先操作ResultSet将数据拿出来,放在实体中,然后返回实体或实体集合,一般不直接返回一个ResultSet对象!
      

  3.   

    关闭操作一般要放到最后面的finally块
      

  4.   

    在数据没有取出来之前statement不能关闭,statement和数据库的游标对应,用来取数据的,你把他关闭了数据当然取不出来。
      

  5.   

    现在在没有关闭Statement的情况下,返回ResultSet是可以的(只不过分成两个方法来处理)。现在不理解的是关闭Statement后,直接用main方法调用失败,而通过web请求调用成功。这是为什么?
      

  6.   

    可现在通过web请求,关闭Statement还是可以取到ResultSet里的值啊,只不过是通过main调用获取值是不行?
      

  7.   

    因为一个查询connection创建了太多的statement,所以需要关闭,而不能等到最后和connection一起关闭。现在不明白的是为什么出现这种现象。
      

  8.   

    你可以使用jstl包中的javax.servlet.jsp.jstl.sql.ResultSupport来处理,ResultSupport类中有一个静态方法可以使用:public static Result toResult(ResultSet rs);Result 中包含了结果集中所有的数据是以Map[]形式存储所有的行记录,一个Map对应一行记录,key是sql语句的别名,value就是具体查询出的值。
      

  9.   

    你也可以自己写一个方法专门处理此种类型的操作,把ResultSet中的数据全部取出来放入到Map中然后关闭statement和ResultSet返回Map[]