日期:2014-05-16  浏览次数:20533 次

关于DB2 jdbc连接数据库,ResultSet自动关闭猜想
问题:java使用db2jcc.jar和db2jcc_license_cu.jar驱动连接DB2数据库,在程序中抛如下异常:
com.ibm.db2.jcc.c.SqlException: [ibm][db2][jcc][10120][10898] 操作无效:已关闭 result set。
at com.ibm.db2.jcc.c.wf.mb(wf.java:3193)
at com.ibm.db2.jcc.c.wf.c(wf.java:247)
at com.ibm.db2.jcc.c.wf.next(wf.java:234)

第一次接触DB2,痛苦万分。。。
对上面的异常我表示很不可思议,反复检查代码,发现在抛出该异常之前并为关闭resultset。俗话说内事不决找baidu,外事不决找google,于是,我在2大搜索引擎上折腾许久,没有对口的。
没办法了,只能自力更生了,我猜是不是DB2自动关闭的。
于是写了几行代码测试了一下,如下:
int j = 1;
boolean eof;
while(rs != null){
    eof = rs.next();
    if(eof){
        System.out.println(j);
        j++;
    } else {
        System.out.println("======================== null");
    }
}


运行结果如下:
======================== null
com.ibm.db2.jcc.c.SqlException: [ibm][db2][jcc][10120][10898] 操作无效:已关闭 result set。
at com.ibm.db2.jcc.c.wf.mb(wf.java:3193)
at com.ibm.db2.jcc.c.wf.c(wf.java:247)
at com.ibm.db2.jcc.c.wf.next(wf.java:234)
果然,当rs.next()读出来是null时,DB2将resultSet关闭了,再执行rs.next()就会抛出已关闭异常。。。
当我把数据库连接换成oracle时,当读出来是null时,不关闭resultSet,只会一直打印======================== null

关于DB2自动关闭resultSet只是我的猜测,暂未找到理论依据,我也没有去ibm官网求证(英文伤不起)。

总结:一直觉得自己在解决问题上的能力比较薄弱,碰到问题通常“一查二问三猜”—去网上查相关资料,问身边的朋友,自己写个代码瞎猜,再就没辙了。。。

希望无所不能的大虾们不吝赐教,多谢!
1 楼 leton2008 2012-05-15  
这个代码你最好格式化一下
int j = 1; 
boolean eof; 
while(rs != null){ 
    eof = rs.next(); 
    if(eof){ 
        System.out.println(j); 
        j++; 
    } else { 
        System.out.println("======================== null"); 
    } 
} 


对于问题的跟踪要仔细,能简单介绍你剖析这个问题的一些过程要点,用步骤些出来让别人更容易理解。

比如昨天有人问我一个问题:
引用
mysql 某数据,按访问量排序,随机前100条,取10条,,,这个SQL语句咋写?


我的回答是:
引用
你这个问题应该是这样吧?结果集首先是要排序100条,然后从这100条中随机选10条吧? 这个算是一个推荐结果查询吧。

如果是这个思路就应该自己琢磨两步走该怎么具体实现。每一步的做法都有文档或者实例的。


很多人是碰到问题觉得难,是因为他基本很少分解问题。如果将问题分解下,其实里面的小步骤分析起来就更有针对性。