1

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
}

このコードは、3 日前までしばらくは問題なく動作していましたが、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);

その後、例外はなくなりました。

もう1つの混乱は、テーブルにデータを入力するときに、まだ次のものを使用していることです

   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は出ていますか?

4

2 に答える 2

1

IBM WAS 7.0 で JDBC を操作しているときにこの例外に直面していました。データ ソースで JCA ライフサイクル管理操作を実行していました。これは、データ ソースのランタイム ステータスを制御するようなものです。パージは、データ ソースの接続プールの内容を削除します。ただし、WAS では、このプールのパージは進行中のトランザクションには影響しません。あなたの側で確認してください。

私が行ったもう一つのことは次のとおりです。Oracle がインストールされているディレクトリのディスク領域がいっぱいだったので、その上に余分な領域を追加しました。

于 2013-07-17T08:50:36.083 に答える
0

ベスト プラクティスとして、java.sql.Date クラスから離れて、to_date() および to_char() 関数を使用して Java と Oracle で日付を処理します。

于 2012-07-17T14:02:04.433 に答える