簡體   English   中英

java.sql.SQLRecoverableException:沒有更多的數據可以從套接字讀取

[英]java.sql.SQLRecoverableException: No more data to read from socket

我在oracle中有一個數據庫表,該表具有DATE類型的列。 如下表所示

表格1

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

在我的Java代碼中,我想獲取特定日期范圍內的total 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。 甲骨文是11克。 這可能是駕駛員的問題嗎? ojdbc7退出了嗎?

在使用IBM WAS 7.0進行JDBC處理時,我遇到了此異常,我已經在數據源上執行了JCA生命周期管理操作。 就像控制數據源的運行時狀態一樣。 清除將刪除數據源連接池的內容。 但是,在WAS中,清除池不會影響正在進行的事務。 檢查你的身邊。

我執行的另一件事是; 磁盤空間在安裝Oracle的目錄上已滿,因此我增加了額外的空間。

最佳實踐是,在使用Oracle處理Java中的Dates時,我遠離java.sql.Date類,並使用to_date()和to_char()函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM