【问题标题】:java.sql.SQLRecoverableException: No more data to read from socketjava.sql.SQLRecoverableException:没有更多数据可以从套接字读取
【发布时间】:2012-07-16 09:34:55
【问题描述】:

我在 oracle 中有一个数据库表,它有一个 DATE 类型的列。如下表所示

表 1

ID   PRODUCT_NAME  ITEM_CNT  ENTERED_DATE 
1         prod1      500       2012-07-01
2         prod2      1000      2012-06-30 

在我的 java 代码中,我想获取某个日期范围内的总 item_cnt。这是代码示例

String sql = "select sum(item_cnt) from table1 where entered_date between ? and ?";
Connection conn = null;
PreparedStatement pstmt = null;
ResultSet rset = null;

try{
   conn = getConnection(url, user, passwd);
   pstmt = conn.prepareStatement(sql);
   pstmt.setDate(1, java.sql.Date.valueOf(from_date)); //from_date is a string of "yyyy-mm-dd"
   pstmt.setDate(2, java.sql.Date.valueOf(to_date)); //to_date is a string of "yyyy-mm-dd"
   rset = pstmt.executeQuery();

   ....
}catch(SQLException e){
   //do something
} finally{
   //clean up
}

这段代码运行良好一段时间,直到三天前,我开始在 pstmt.executeQuery(); 行收到以下异常;

    java.sql.SQLRecoverableException: No more data to read from socket
at oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1157)
at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:290)
at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
at oracle.jdbc.driver.T4CPreparedStatement.executeForDescribe(T4CPreparedStatement.java:884)
at oracle.jdbc.driver.OracleStatement.executeMaybeDescribe(OracleStatement.java:1167)
at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1289)
at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584)
at oracle.jdbc.driver.OraclePreparedStatement.executeQuery(OraclePreparedStatement.java:3628)
at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery(OraclePreparedStatementWrapper.java:1493)

我试图寻找答案,但找不到任何能真正解释它的东西。然后我将我的 sql 查询更改为

    "select sum(item_cnt) from table1 where entered_date between to_date(?, 'yyyy-mm-dd')  and to_date(?, 'yyyy-mm-dd')";

我没有设置日期,而是将准备好的语句更改为以下内容

     pstmt.setString(1, from_date);
     pstmt.setString(2, to_date);

然后异常就消失了。

另一个困惑是,当我填充表格时,我仍在使用以下内容

   pstmt.setDate(1, java.sql.Date.valueOf(date)); //date is a string of format "yyyy-mm-dd"

它仍在工作。只有 select 语句给了我例外。

现在一切正常,但我真的很想知道为什么。有谁知道吗?

我最近确实将我的 java 升级到了 1.7.0_03-b05。我正在使用ojdbc6.jar。预言机是 11g。会不会是司机的问题? ojdbc7 出来了吗?

【问题讨论】:

    标签: java oracle jdbc


    【解决方案1】:

    我在使用 IBM WAS 7.0 处理 JDBC 时遇到了这个异常,我对数据源执行了 JCA 生命周期管理操作。这就像控制数据源的运行时状态。 Purge 删除数据源连接池的内容。但是,在 WAS 中,清除池不会影响正在进行的事务。检查在你身边。

    我表演的另一件事是;安装 Oracle 的目录上的磁盘空间已满,我在上面添加了额外的空间。

    【讨论】:

      【解决方案2】:

      作为最佳实践,我在使用 Oracle 处理 Java 中的日期时远离 java.sql.Date 类并使用 to_date() 和 to_char() 函数。

      【讨论】:

      猜你喜欢
      • 2021-01-23
      • 2012-09-18
      • 2018-01-07
      • 2015-02-04
      • 2011-12-11
      • 2015-05-12
      • 2015-03-10
      • 2017-06-17
      相关资源
      最近更新 更多