PreparedStatement#setCharacterStrema(int, Reader, int)が想定どおりの動作をしない
バグ報告をしてくださった方に質問ですが・・・
「ストリームなど」となっていますが、setCharacterStream以外にも同様の事象を発見しているのでしょうか?現時点で軽くソースを見た限りにおいては、setCharacterStreamだけかと思っているので、この関数に限定した不具合としてチケットを変更しておきました。もしほかの関数も該当しているということであれば教えていただけると助かります。
nagatyo への返信
バグ報告をしてくださった方に質問ですが・・・
こちらで動作確認しているのは、setCharacterStreamだけです。
報告後に、他のStreamを使用している関数はコピーしたものを使用していることをコード上で確認していました・・・
コードを見直したところ、setClob、setBlobあたりも直接参照されているようですが、こちらで動作させるコードがなかったので、どのように動作するかは、 未確認となります。おそらく、各Lobおよび、JDBCの内部実装に依存していると推測されるくらいです。
あと、発生バージョン等、情報不足の上、あいまいな記載をして済みませんでした。追記ありがとうございます。
None への返信
コードを見直したところ、setClob、setBlobあたりも直接参照されているようですが、こちらで動作させるコードがなかったので、どのように動作するかは、 未確認となります。おそらく、各Lobおよび、JDBCの内部実装に依存していると推測されるくらいです。
コードを見る限り、setB/Clobあたりも問題が発生しそうに見えます。 (今試せる状況に無いですがそのうち試してみます) LOB系は対処がちょっと厄介そうだなぁ・・・。
あと、発生バージョン等、情報不足の上、あいまいな記載をして済みませんでした。追記ありがとうございます。
あれだけしっかり内容が書かれていれば十分だと思います。ありがとうございます。
【発生バージョン】
Forest5.1.0
【概要】
PreparedStatement#setCharacterStrema(int, Reader, int)が想定どおりの動作をしない
【事象詳細】
PreparedStatement#setCharacterStrema(int, Reader, int)を使用した場合に、片方のDBのみに値がセットされ、もう片方のDBでは空文字となる。 (このサンプルでの実行時には前述の結果となったが、タイミングやReaderの実装の種類によっては不測の事態が発生することもありうる)
サンプルコード
【対処方法】
setAscii/Binary/UnicodeStreamと同様に、ストリームをコピーする形の実装をすればよい。 (本来なら分岐ストリームオブジェクト的なものを作るべきだが、現時点で実装案が無いので上記方法で対処)