在不同版本的Weblogic平台上迁移应用,产生了很严重的JDBC驱动版本不兼容的问题。

但是归根究底是代码的问题,废话少说,上代码示例。

  1. .....
  2. //以下是问题代码
  3. ResultSet rs=null;
  4. Statement st=null;
  5. rs=st.executeQuery("...");
  6. while(rs.next())
  7. {
  8. String data=rs.getString("...");
  9. ...........
  10. ResultSet innerRS=null;
  11. innerRS=st.executeQuery(".....");//在ojdbc6.jar的实现中,这行代码会关闭rs对象。
  12. while(innerRS.next())
  13. {
  14. String innerData=innerRS.getString(".....");
  15. .......
  16. }
  17. }
  18. ......................

以上这段代码在使用jdbc-1.4.jar或者ojdbc14.jar这两个包时是没有问题的,前者是独立的JDBC包,后者是Weblogic9.2使用的包。

但是,如果使用ojdbc6.jar这个包时,问题就会出现了,异常为SQLException: Result set already closed.

个人推测,Oracle在jdbc-1.4.jar这个版本的JDBC实现中,并未遵守JDBC规范,因为Java规范中明确说道:

By default, only one ResultSet object per Statement object can be open at the same time. Therefore, if the reading of oneResultSet object is interleaved with the reading of another, each must have been generated by differentStatement objects. All execution methods in the Statement interface implicitly close a statment's currentResultSet object if an open one exists.

简单来说,就是如果使用同样的Statement执行两次executeQuery查询,那么之前返回的ResultSet对象都会被关闭。

而很明显,Oracle在其1.4的实现中并未遵循这个规范,而在6这个版本中又遵循了这个规范,所以会在迁移的时候是这个代码本身的问题暴露出来。

综上所述

解决方案一:

在迁移时,为你的应用指定具体的包,防止驱动不兼容的情况。但是这个方法通常很麻烦,因为会有可能在很隐蔽的地方使你指定的驱动不生效。

解决方案二:

修改代码,这个是根本的解决之道,只要保证创建了某个ResultSet实例的Statement实例,在这个ResultSet用完之前,不要再次使用就可以。

至于具体的代码怎样写,最佳实践的例子有很多,不多赘述,只提供上述问题代码的修正版:

    1. .....
    2. //以下是没有问题的代码
    3. ResultSet rs=null;
    4. Statement st=null;
    5. rs=st.executeQuery("...");
    6. while(rs.next())
    7. {
    8. String data=rs.getString("...");
    9. ...........
    10. ResultSet innerRS=null;
    11. Statement innerST=conn.createStatement();
    12. innerRS=innerST.executeQuery(".....");//在ojdbc6.jar的实现中,这行代码会关闭rs对象。
    13. while(innerRS.next())
    14. {
    15. String innerData=innerRS.getString(".....");
    16. .......
    17. }
    18. }
    19. ......................                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    转:http://blog.csdn.net/sun9701210/article/details/6867366

由多次使用Statement实例引起的Result set already closed异常的解决方案的更多相关文章

  1. layui前端框架实例(修复官网数据接口异常问题)

    layui前端框架实例,官网的实例会提示数据接口异常,已修复. 主要是修改数据表格,做一个可以用的实例,可以选中,编辑,删除等. gitee地址:https://gitee.com/pingg2019 ...

  2. 实例解读丨关于GaussDB ETCD服务异常

    摘要:本文通过对ETCD服务异常问题分析,代码展示解决方案. 本文分享自华为云社区<[实例状态]GaussDB ETCD服务异常>,作者:酷哥. 首先确认是否是虚拟机.网络故障 虚拟机故障 ...

  3. 【oracle】Enterprise Manager 无法连接到数据库实例。下面列出了组件的状态---个人解决方案

    最近在学习Oracle,平常喜欢使用EM查看数据库状态,但是在最近突然发现EM连接不上Oracle数据库了,不知道问题出在哪里,只好卸载了重装.但是,在使用了几天以后,又出现了相同的问题,于是下决心将 ...

  4. MyBatis 源码分析——生成Statement接口实例

    JDBC的知识对于JAVA开发人员来讲在简单不过的知识了.PreparedStatement的作用更是胸有成竹.我们最常见用到有俩个方法:executeQuery方法和executeUpdate方法. ...

  5. junit4X系列--Statement

    原文出处:http://www.blogjava.net/DLevin/archive/2012/05/11/377954.html.感谢作者的无私分享. 初次用文字的方式记录读源码的过程,不知道怎么 ...

  6. 《深入理解mybatis原理》 MyBatis的架构设计以及实例分析

    作者博客:http://blog.csdn.net/u010349169/article/category/2309433 MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简 ...

  7. statement对象与sql语句(新手)

    本篇介绍读上篇代码中的疑惑点 实现简单网页上对数据内容进行增删改查,需要用到三个部分:jsp网页前端部分+java后台程序+数据库表 一.创建一个Statement (用于在已经建立数据库连接的基础上 ...

  8. 《深入理解mybatis原理1》 MyBatis的架构设计以及实例分析

    <深入理解mybatis原理> MyBatis的架构设计以及实例分析 MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单.优雅.本文主要讲述MyBatis的架构 ...

  9. MyBatis的架构设计以及实例分析

            MyBatis是目前非常流行的ORM框架,它的功能很强大,然而其实现却比较简单.优雅.本文主要讲述MyBatis的架构设计思路,并且讨论MyBatis的几个核心部件,然后结合一个sel ...

随机推荐

  1. VB中判断空的几种方法,Null, Missing, Empty, Nothing, vbNullString区别

    vb6中存在几个虚幻的值:Null.Missing.Empty.Nothing.vbNullString.除了最后一个之外,每一个值都不能直接用“a=值”来判断.下面分别解释一下这几个值的含义. 1. ...

  2. 求助:为什么我用360浏览器和UC浏览器打不开JAVA中的index.html文件? 一打开就显示浏览器首界页

    如下图,在oracle官网下载了一个JAVA的API文档,双击index.html时打开是浏览器的首页,不知道为什么?请问怎样才能以chm文档格式显示?

  3. TortoiseSVN 同步分支

    对比工具可以使用 winmerge 和 beyond compare ,winmerge免费小巧,beyond compare功能更强大.这两款工具都比TortoiseSVN自带的对比工具要好一些. ...

  4. CSS图片垂直居中方法

    让div里面的多行文本垂直居中的方法: div{height:100px;width:100px;border:solid 1px red;text-align:center; display:tab ...

  5. OAF_架构MVC系列2 - Model的概述(概念)

    2014-06-22 Created By BaoXinjian

  6. set_union的几个例子

    获得两个集合的并集.两个输入序列须保证已排好序. 数组用的时候 // set_union example #include <iostream> #include <algorith ...

  7. 白书 4.1.2 模运算的世界 P291

    1.逆元 这里有个注意事项要说,就是当要求 (a-b)%m 的时候要注意不能直接 (a%m-b%m)%m 原因是得出的值有可能是负数,所以 (a%m-b%m+m)%m 才是正确的. //x,y是引用 ...

  8. [实变函数]2.1 度量空间 (metric space), $n$ 维 Euclidean 空间

    1 回忆:    $$\bex    \lim_{n\to\infty}a_n=a\lra \forall\ \ve>0,\ \exists\ N,\ \forall\ n\geq N,\mbo ...

  9. bootstrap-输入框组

    <!-- input-group 只能针对输入框,输入框组 input-group-addon 给输入框前后添加的额外元素 input-group-btn 添加的额外元素是按钮: --> ...

  10. DEDE织梦,文章页里的幻灯调用,能调用全部栏目的吗

    arclist 是必须要有 typeid 设置的,如果你没设置,默认是取的当前栏目的 typeid,而首页取到的是 top,所以你强制指定typeid=top就可以了.---------------- ...