次のエラーを回避するために、Oracleでlong値を処理するカスタムLongクラスを作成するにはどうすればよいですか?Hibernateのカスタム型 '原因:java.sql.SQLException:ストリームがすでに閉じられています'
原因:java.sql.SQLException:ストリームはすでにクローズされています。
おかげ
次のエラーを回避するために、Oracleでlong値を処理するカスタムLongクラスを作成するにはどうすればよいですか?Hibernateのカスタム型 '原因:java.sql.SQLException:ストリームがすでに閉じられています'
原因:java.sql.SQLException:ストリームはすでにクローズされています。
おかげ
オラクルrecommends not usingLong
とLong Raw
列(オラクル8iの以降)。これらは、従来の理由からのみOracleに含まれています。あなたが実際にそれらを使用する必要がある場合は、最初ResultSet
内の任意の他の列に触れることを試みる前に、これらの列を処理する必要があります:
Docs:
クエリは、1つまたは複数のLONGまたはLONG RAW列を選択した場合JDBCドライバーはこれらの列をストリーミング・モードでクライアントに転送します。 executeQueryまたはnextの呼び出しの後、LONG列のデータは読み込みを待機しています。
LONG列のテーブルを作成しないでください。代わりにラージ・オブジェクト(LOB)列、CLOB、NCLOBおよびBLOBを使用します。 LONG列は下位互換性のためにのみサポートされています。既存のLONG列をLOB列に変換することをお薦めします。 LOB列は、LONG列よりもはるかに少ない制約を受けます。
これは、questionを参照してください。
「Oracleでlong値を処理するためのカスタムLongメソッドを作成する方法」ではなく、Oracle long raw列を問い合せるときに「Stream has already closed」エラーを回避するのに役立つかもしれません。
このエラーは、列の種類を変更する可能性のない従来のデータベースを使用して発生しました。 hibernate3セッションファクトリとトランザクションマネージャでSpringを使用します。この問題は、複数のタスクが同時にDAOにアクセスしているときに発生しました。 私たちはojdbc14.jarドライバを使用していて、運がないより新しいドライバを試しました。
OJDBCドライバの接続プロパティでuseFetchSizeWithLongColumn = trueを設定すると、問題が解決しました。 OracleDriver API
これは単に唯一の財産です。他のドライバと一緒に使用しないでください。 ドライバ。 "true"に設定すると、 'SELECT'でデータを取得するときのパフォーマンスは向上しますが、LONG 列を処理するためのデフォルトの動作は複数行(プリフェッチサイズ)を取得するように変更されます。 は、このデータを読み取るために十分なメモリが割り当てられることを意味します。したがって、 このプロパティを使用する場合は、 検索のLONG列が大きすぎないか、メモリが不足している可能性があります。このプロパティー は、Javaプロパティーとして設定することもできます。java -Doracle.jdbc。useFetchSizeWithLongColumn =真のあるmyApplication
これは、システムテーブルのクエリで起こる:
SELECT * FROM all_tab_columns
WHERE owner = 'D_OWNER' AND COLUMN_NAME LIKE 'XXX%';
それはどのように質問に答えますか? – gaborsch
私はあなたが結果からOracleのLONG値を取得しようとすると、このメッセージが表示されます複数回設定すると思います。
は、私のようなコードを持っていた:
rs.getString(i+1) ;
if (rs.wasNull()) continue ;
set(queryAttr[i], rs.getString(i+1)) ;
そして私は入門「ストリームがすでに閉じられています。」エラー。私は、コードを変更したときに、私はエラーを取得停止:
String str = rs.getString(i+1) ;
if (rs.wasNull()) continue ;
set(queryAttr[i], str) ;
私はのために休止状態のUserTypeを実装することで、試してみました長いが、それでも同じエラーによって引き起こさ:ます。java.sql.SQLException:ストリームは、すでに誰も私を示唆closed.Canてきましたこのエラーを回避するには? – user1316131
もっと洗練されたものを試す直前に...新しいJDBCドライバを試しましたか? – Anonymous
さらに、Hibernateは、必要に応じて 'ResultSet'から列を取得します。 'LONG RAW'列を最初に取得するのは問題ないでしょうか? (Oracleは、列が左から右の順番でアクセスされ、ストリーム列の後の列にアクセスするとストリームが閉じられるとみなします) – Anonymous