かえでBlog

色々なことを徒然と……

log4jdbcにてsetStringで入らない文字列を処理する方法。

      2013/04/29

センター試験の日ですね。受験生の方は実力発揮できるようにがんばってください。
おはようございます。渉猟です。

仕事でJAVAバッチ製作で、SQLログ吐き出しができるようにlog4jdbcを使っています。

SQLの処理はPreparedStatementで処理するのですが、とある文章をSetStringで入れようとしたら以下のエラーが発生しました。
【java.sql.SQLException: setStringでは、32766文字未満の文字列のみ処理できます】

setStringは32755文字までしか入らないみたいですね。

なので、バッチが急に動かなくなったので急遽対応することになりました。
ちなみにデータベースはoracleのClobに入れると想定。

上司から「setClobでできるんじゃないの?」と解決案を提示していただいたので、setClobでやろうとしました。

以下抜粋
PreparedStatement pstmt = null;
pstmt = conn.prepareStatement(SQL);
Reader rd = new StringReader(STR);
pstmt.setClob(1,rd);

これで実行したら以下のようなエラーメッセージが出ました。
Exception in thread "main" java.lang.AbstractMethodError: oracle.jdbc.driver.T4CPreparedStatement.setClob(ILjava/io/Reader;)V
at net.sf.log4jdbc.PreparedStatementSpy.setClob(PreparedStatementSpy.java:908)

実装がないだと・・・・・・?

setClob(1,rd)⇒pstmt.setCharacterStream(1,rd)
に変更しても同様のエラーに・・・・・・

原因をgoogle先生に尋ねても、なかなかいい返事をもらうことができず、ずっと悩んでいました。

そして、ある海外のサイト(URL忘れました;)にて閲覧すると、setCharacterStream(1,rd,STR.length());だといけるとのこと。

早速それで試してみると処理ができるようになりました。

setClobとかはJDK1.6に追加されたものなので、log4jdbcには対応できていないんじゃないかな。

なので、文字数でsetStringができない場合は試してはどうでしょうか。

 - 備忘録, JAVA , , , , ,