我在oracle中有一个数据库表,它有一个DATE类型的列。它看起来像下表
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。神谕是11克。这可能是司机的问题吗?是ojdbc7吗?
答案 0 :(得分:1)
我在使用IBM WAS 7.0处理JDBC时遇到了这个异常,我在数据源上执行了JCA生命周期管理操作。这就像控制数据源的运行时状态。 清除会删除数据源的连接池内容。但是,在WAS中,清除池不会影响正在进行的事务。检查你的身边。
我表演的另一件事是;在安装Oracle的目录上磁盘空间已满,我在其上添加了额外的空间。
答案 1 :(得分:0)
作为一种最佳实践,我远离java.sql.Date类,并在使用Oracle处理Java中的日期时使用to_date()和to_char()函数。