2012-07-17 71 views
0

我有一個oracle數據庫表中有一個DATE類型的列。它看起來像見下表java.sql.SQLRecoverableException:沒有更多的數據要從套接字讀取

TABLE1

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。 oracle是11g。這可能是駕駛員的問題嗎?是ojdbc7了嗎?

回答

0

作爲一種最佳實踐,我遠離java.sql.Date類,並在使用Oracle處理Java日期時使用to_date()和to_char()函數。

+0

你能解釋一下爲什麼嗎?因爲它是越野車?或表現不佳?或者是其他東西? – hli 2012-07-17 14:07:04

+0

[這個stackoverflow討論](http://stackoverflow.com/questions/2305973/java-util-date-vs-java-sql-date)是非常有用的。 – Shilpa 2012-07-17 16:12:15

1

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

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

相關問題