[Seasar-user:1209] Re: Oracle JDBC(Thin) + S2DaoでのCLOBの扱い

Hikaru Taniguchi taniguchi
2004年 11月 25日 (木) 09:13:32 JST


たにぐちです。

ひがさん 縣さん 返信ありがとうございます。

BLOB作戦、一度試してみたいと思います。insertHoge() updateHoge()のどち
らでもベタベタな対策をするのはどうも違いますし、S2Daoの恩恵を受けるポ
イントとしても重要なところだと思うので、なんというか「Oracleのだめドラ
イバとS2Daoにうまく付きあってもらう対策パターン」みたいなものかと思っ
て居ます。

byte[] -> String でキャラクタセットの問題の所在がJava側になりますが(デー
タベースの独立性というか、Javaじゃないクライアントアプリはどうするんだ
という話もありますが、現実的にはほとんど問題にならないはずですよね)
とにかく目的を速く達成することを優先してみたいと思いますので。

ありがとうございます。

縣さん、
At Thu, 25 Nov 2004 02:04:09 +0900,
Toshitaka Agata <[E-MAIL ADDRESS DELETED]> wrote:
> (たぶん9iでも一部しか解消されていなかったはずです)
 残念です…

> 1.UPDATE テーブル名 SET CLOBカラム名=emtpy_clob() WHERE 条件
>   を使い、更新したいCLOB領域をクリアする。
>   (これがないとゴミが残ります)
 これなんですが、
 いったん oracle.sql.CLOBを取得したあとは以下の手順でokなようです。
 CLOB a = (CLOB)object;
  writer = a.getCharacterOutputStream();
  writer.write( 長いtext() );
  writer.flush();
  writer.close();
  // ここ
  a.trim( 長いtext().length() );

 trimでいけるようです。ちなみに、 java.sql.Clobにも truncate()という
同様の目的のメソッドがありますがこちらをコールすると

 「サポートされない機能です」

 とのことで、Oracle様はスゴいです。入り口を二つ作るだけなんですけどね。
(JDBC2.0(2.1?)でjava.sql.Clobが標準になる前からサポートしていたという自負の
表れでしょうか?)

> 2.SELECT FOR UPDATEにより、対象行を取得。
> 3.ResultSetからjava.sql.Clobオブジェクトを取得。
> 4.ClobオブジェクトをoracleのCLOBオブジェクトにキャスト。
> 5.CLOBオブジェクトから、OutputStreamを取得。
> 6.OutputStreamに対して更新データを出力。
  手順としては合っているみたいで安心しました。なんだか不安だったので…

> インサート時はClob以外を普通にインサートして、
> 上記の手順を全て実行します。
> また、Type2,Type4のドライバには多少違いがあって、
> Type4のほうがましだったと記憶しています。
 そのようです。マニュアルによると、jdbc標準のClobインタフェースでのア
クセスが提供されているようです。

> これらはOracleのJDBCドライバのバグの回避策だったと
> 認識しています。
> 10gや最新のJDBCドライバの状況は分かりませんが、
> 参考になればと思い、メール致しました。
 10gのthinドライバでアクセスすると単純なselectで暴走(かえって来ない)
したり、謎のArrayIndexOutOfBoundsExceptionが出たりするので 9iには9iの
ドライバしか使うなということのようです.

 ともあれ、Oracleに特化した問題!ということなんでうまくバランスをとっ
て折り合いを付けたいと思います。DBのほうをBLOBにする、というのがOracle
のせいだ、とすると、DTO(Entity)の該当型が byte[]のセッタを持たないとい
けない、というのもOracle依存を発端にしてることなので気持ちは微妙です。

 ありがとうございます。

--
Hikaru Taniguchi <[E-MAIL ADDRESS DELETED]>



Seasar-user メーリングリストの案内