Ticket #21380

PreparedStatement#setCharacterStrema(int, Reader, int)が想定どおりの動作をしない

Open Date: 2010-04-12 10:03 Last Update: 2010-04-15 19:29

Reporter:
(Anonymous)
Owner:
(None)
Type:
Status:
Open
Component:
(None)
MileStone:
(None)
Priority:
5 - Medium
Severity:
5 - Medium
Resolution:
None

Details

【発生バージョン】
Forest5.1.0

【概要】
PreparedStatement#setCharacterStrema(int, Reader, int)が想定どおりの動作をしない

【事象詳細】
PreparedStatement#setCharacterStrema(int, Reader, int)を使用した場合に、片方のDBのみに値がセットされ、もう片方のDBでは空文字となる。 (このサンプルでの実行時には前述の結果となったが、タイミングやReaderの実装の種類によっては不測の事態が発生することもありうる)

サンプルコード

stmt.execute("create table public.hoge(id int primary key, str text);");
PreparedStatement pstmt = con.prepareStatement("insert into public.hoge values (?,?);");
String str = "longlonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglonglong";
pstmt.setInt(1, 1);
Reader reader = new StringReader(str);
pstmt.setCharacterStream(2, reader, str.length());
pstmt.addBatch();
pstmt.executeBatch();

【対処方法】
setAscii/Binary/UnicodeStreamと同様に、ストリームをコピーする形の実装をすればよい。 (本来なら分岐ストリームオブジェクト的なものを作るべきだが、現時点で実装案が無いので上記方法で対処)

Attachment File List

No attachments

Ticket History (3/6 Histories)

2010-04-12 10:03 Updated by: None
  • New Ticket "setCharacterStreamで値が抜ける" created
2010-04-14 10:19 Updated by: nagatyo
  • Details Updated
  • Summary Updated
2010-04-14 10:20 Updated by: nagatyo
  • Details Updated
  • Summary Updated
2010-04-14 10:25 Updated by: nagatyo
Comment

バグ報告をしてくださった方に質問ですが・・・

「ストリームなど」となっていますが、setCharacterStream以外にも同様の事象を発見しているのでしょうか?現時点で軽くソースを見た限りにおいては、setCharacterStreamだけかと思っているので、この関数に限定した不具合としてチケットを変更しておきました。もしほかの関数も該当しているということであれば教えていただけると助かります。

2010-04-14 15:58 Updated by: None
Comment

nagatyo への返信

バグ報告をしてくださった方に質問ですが・・・

こちらで動作確認しているのは、setCharacterStreamだけです。

報告後に、他のStreamを使用している関数はコピーしたものを使用していることをコード上で確認していました・・・

コードを見直したところ、setClob、setBlobあたりも直接参照されているようですが、こちらで動作させるコードがなかったので、どのように動作するかは、 未確認となります。おそらく、各Lobおよび、JDBCの内部実装に依存していると推測されるくらいです。

あと、発生バージョン等、情報不足の上、あいまいな記載をして済みませんでした。追記ありがとうございます。

2010-04-15 19:29 Updated by: nagatyo
Comment

None への返信

コードを見直したところ、setClob、setBlobあたりも直接参照されているようですが、こちらで動作させるコードがなかったので、どのように動作するかは、 未確認となります。おそらく、各Lobおよび、JDBCの内部実装に依存していると推測されるくらいです。

コードを見る限り、setB/Clobあたりも問題が発生しそうに見えます。 (今試せる状況に無いですがそのうち試してみます) LOB系は対処がちょっと厄介そうだなぁ・・・。

あと、発生バージョン等、情報不足の上、あいまいな記載をして済みませんでした。追記ありがとうございます。

あれだけしっかり内容が書かれていれば十分だと思います。ありがとうございます。

Edit

You are not logged in. I you are not logged in, your comment will be treated as an anonymous post. » Login