java.sql.SQLException: 关闭的连接

 

 最近工作中遇到一个非常奇怪的问题,数据库没有进行补丁修复,应用没有修改过,程序也没有变动过,但是weblogic后台一直报异常,信息如下:

java.sql.SQLException: 关闭的连接
        at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapping.ja
va:70)
        at oracle.jdbc.driver.DatabaseError.newSQLException(DatabaseError.java:1
12)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java
:173)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java
:229)
        at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java
:403)
        at oracle.jdbc.driver.PhysicalConnection.createStatement(PhysicalConnect
ion.java:2925)
        at oracle.jdbc.driver.PhysicalConnection.createStatement(PhysicalConnect
ion.java:2902)
        at weblogic.jdbc.wrapper.Connection.createStatement(Connection.java:443)

        at qqbean.sm.oms.system.service.OrderTimerBO.selectProductTeam(OrderTime
rBO.java:166)
        at qqbean.sm.oms.system.service.OrderReduceTimer.run(OrderReduceTimer.ja
va:38)
        at java.util.TimerThread.mainLoop(Timer.java:512)
        at java.util.TimerThread.run(Timer.java:462)

当前有事业务高峰期,功能部分好用,部分异常,电话一个接一个,头脑开始肿大。根据以上异常,自我判断为以下几点并根据以下

几点进行排查;

1、服务器进行补丁修复

      查看系统日志,未发现有补丁修复的记录,也没有weblogic应用异常的信息;排除该可能性;

2、数据库进行补丁修复

      联系IBM运维团队,并为对数据库进行补丁修复;排除该可能性;

3、weblogic连接池配置问题

       weblogic连接池进行测试连接没有问题,重启部署不能解决问题,郁闷中......

4、oracle的session超过系统最大值

       查看当前用户的session没有限制排除该问题;

 

百感交集在查看后台日志,看到如下信息:

[ERROR] AbstractDAO:314 - java.sql.SQLException: ORA-00600: internal error code,
 arguments: [kkslgbv0], [], [], [], [], [], [], []

 

根据这个错误得知是数据库的一个bug:

Bug 5155885  OERI[kkslgbv0] with CURSOR_SHARING=similar
 This note gives a brief overview of bug 5155885.
 The content was last updated on: 03-APR-2009

 
Click here for details of each of the sections below.
Affects:

Product (Component)Oracle Server (Rdbms)
Range of versions believed to be affectedVersions < 11
Versions confirmed as being affected
    • 10.2.0.3
Platforms affectedGeneric (all / most platforms affected)

Fixed:
This issue is fixed in
    • 10.2.0.2 Patch 6 on Windows Platforms
    • 10.2.0.3 Patch 1 on Windows Platforms
    • 10.2.0.3 Patch 24 on Windows Platforms
    • 10.2.0.4 (Server Patch Set)
    • 11.1.0.6 (Base Release)
Symptoms:Related To:
    • Internal Error May Occur (ORA-600)
    • ORA-600 [kkslgbv0]
    • Literal Replacement (CURSOR_SHARING)
    • CURSOR_SHARING
    • _OPTIM_PEEK_USER_BINDS

Description

    • A ORA-600 can occur while accessing a bind value while deciding whether
      to shared a cursor or not when literal replacement is enabled.


      Workaround
       Use CURSOR_SHARING=EXACT or set "_optim_peek_user_binds"=false so that

       bind values are not peeked.

Please note: The above is a summary description only. Actual symptoms can vary. Matching to any symptoms here does not confirm that you are encountering this problem. Always consult with Oracle Support for advice.

References

针对这个问题,修复bug可能会导致更严重的问题,于是准备从导致该bug的sql出手,避开该bug。功夫不负有心人,问题终于通过修改sql后得到解决。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: java.sql.SQLException: 结果集已耗尽是一个JDBC异常,表示已经遍历完了结果集中的所有数据。 当使用JDBC从数据库中查询数据时,查询结果会以结果集的形式返回给应用程序。结果集是一个类似表格的结构,包含了一系列的记录和字段。 当我们向结果集中读取数据时,使用next()方法将指针移动到下一行,并返回一个布尔值,表示下一行是否存在。如果存在,我们可以获取该行的数据。如果不存在,即遍历完了整个结果集,将抛出java.sql.SQLException: 结果集已耗尽异常。 这个异常通常出现在以下情况下: 1. 当使用ResultSet对象从数据库中读取数据时,读取到最后一行,然后再次调用next()方法。 2. 当在一个ResultSet对象读取数据时,将ResultSet对象传递给其他方法或者其他线程,而这个ResultSet对象已经遍历完了所有数据。 3. 当使用同一个Statement对象执行多个查询语句时,如果没有使用close()方法显式关闭ResultSet对象,那么当执行下一个查询时,结果集已经被耗尽。 为了避免java.sql.SQLException: 结果集已耗尽异常,我们可以在使用ResultSet对象之后,及时关闭ResultSet、Statement和Connection对象,以释放资源。同时,在使用ResultSet对象之前,也可以先调用next()方法检查是否存在下一行数据,避免无法读取数据时抛出异常。 总之,java.sql.SQLException: 结果集已耗尽异常表示已经读取完了结果集中的数据,可通过关闭ResultSet、Statement和Connection对象以及在使用ResultSet之前检查是否存在下一行数据来避免该异常的发生。 ### 回答2: java.sql.SQLException: 结果集已耗尽是指在使用 JDBC 进行数据库查询时,结果集已经被遍历完毕,没有更多的数据可供访问。 当使用 ResultSet 对象获取数据库查询的结果集时,通常会使用 next() 方法来判断是否还有更多的数据行可供读取。如果 next() 方法返回 false,即表示结果集已经到达末尾。 出现 ResultSet exhausted 的原因可能有以下几种情况: 1. 结果集已经被完全遍历:通过在循环中使用 next() 方法遍历结果集时,如果没有在循环中提前退出或跳出循环,可能导致结果集被完全遍历。 示例代码如下: ```java ResultSet rs = statement.executeQuery("SELECT * FROM table_name"); while (rs.next()) { // 遍历结果集的每一行数据 // ... } // 循环结束后,结果集已经耗尽 ``` 2. 结果集使用完毕后未关闭:使用完 ResultSet 对象后,应该及时调用 close() 方法关闭结果集,以释放相关资源。 示例代码如下: ```java ResultSet rs = statement.executeQuery("SELECT * FROM table_name"); // 处理结果集数据 // ... rs.close(); // 关闭结果集 ``` 3. 结果集在查询语句执行后未立即访问:某些情况下,当查询语句执行后,如果不立即访问结果集,而是先执行其他操作,可能导致结果集耗尽。 示例代码如下: ```java ResultSet rs = statement.executeQuery("SELECT * FROM table_name"); // 其他业务逻辑处理 // ... while (rs.next()) { // 访问结果集数据 // ... } ``` 为避免出现结果集已耗尽的异常,应该在使用 ResultSet 对象时及时关闭结果集,并在执行查询后立即访问结果集。另外,也可以通过判断结果集的元数据(例如列数、列类型等)来确定是否有数据可供读取。 ### 回答3: java.sql.SQLException: 结果集已耗尽,是指在使用Java程序连接数据库,并且执行SQL查询语句后,尝试获取结果集中的下一行数据时,但是结果集已经没有更多的数据可供获取,此时程序会抛出此异常。 这种情况通常发生在以下几种情况下: 1. 在使用游标(ResultSet)遍历结果集时,已经遍历到结果集的最后一行,再次调用next()方法获取下一行数据时,就会出现该异常。 2. 在使用游标(ResultSet)遍历结果集时,再次调用next()方法获取下一行数据时,结果集已经被其他操作关闭了,导致结果集不可访问,此时也会抛出该异常。 3. 在使用游标(ResultSet)遍历结果集时,结果集的大小与代码逻辑不符合,比如结果集本应该有5行数据,但是已经提前遍历到了第6行,再次获取数据时就会出现该异常。 要解决这个问题,可以采取以下措施: 1. 在使用游标遍历结果集时,使用if语句判断是否还有下一行数据,避免出现结果集已耗尽的情况。如: while(resultSet.next()){ // 获取数据 } 2. 在多线程环境下,对于可能会关闭结果集的操作,需要进行合适的同步处理,避免在其他线程中关闭结果集时,当前线程还在尝试获取数据。 3. 检查代码逻辑,确保结果集的大小与代码中对结果集的操作一致,避免出现不一致的情况。 总结:当出现java.sql.SQLException: 结果集已耗尽的异常时,说明在操作结果集时,结果集已经没有更多的数据可供获取了。解决该问题可以通过合理的代码逻辑和对结果集的判断,避免出现该异常。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值