- - PR -
CLOBへの書き込みについて
投稿者 | 投稿内容 |
---|---|
|
投稿日時: 2005-08-04 21:25
こんばんは。
自分の場合も類似な問題に遭遇していますので、 このスレに書かせていただきました。 現在、テーブルにあるBLOB型のデータを取得し、 別のテーブルに保存しようとしていますが、うまく行ってません。 (commitした後はテーブルの該当コラムにnullのままでした。) 手順は下記です。 @BLOBのデータを取得し、ディスクにファイルを作成する。 A空のBLOB(empty_blob)を作成する。 BgetBinaryOutputStreamで空のBLOBのストリーム(書込み用)を得る。 C上記@にて作成されているファイルのストリーム(読込み用)を取得する。 Dデータの書込み(C→B)を行う。 Ecommit 確認したところ、ドライバ等には特に問題ないと思います。 ディスク上にファイルが作成されることを確認しています。 どなたがその原因がわかれば、ご教示していただきたいのです。 |
|
投稿日時: 2005-08-04 22:11
差し支えなければプログラムの該当部分をコピー&ペーストしていただけますか。
ヘルプミーさんの書かれた手順はあくまでヘルプミーさんの思う意図であって、実際のプログラムがその意図に即していないおそれがあります。 |
|
投稿日時: 2005-08-04 22:33
ヘルプミーさんはどんな環境でしょうか?
・DBサーバ ・バージョン ・ドライバ ・OS |
|
投稿日時: 2005-08-05 11:19
Gioさん、かつのりさん、ご返事ありがとうございます。
→Gioさんへ Gioさんのおっしゃっている内容より、その手順には特に 問題なさそうな気がしますが、よろしいでしょうか? こちらの環境では、javaのスタンダードクラスではなく、 第三者にいただいたミドルウェアが使われてますので、 該当のソースを貼り付けても、あまり読めない部分も結構あるか とも思いますので…申し訳ないです。 一応上記に書かれてある「ディスクにファイルを作成する。」 という処理をなくして、BLOB→BLOBのように試してみた結果OKでした。 ・この前ディスク上にファイルを作成することができる、 ・デバッグした結果、ちゃんとファイルから読込み用のストリームは取っている …ということで、その後のどっかに問題あるのかなと考えていますが、 (というのは上記Dにはあやしいことがある??) いまだに何も見つけていません。 →かつのりさんへ 環境関連の情報は下記のとおりです。 ・DBサーバ:Oracle9i ・バージョン:JDK1.4.2 ・ドライバ:JDBC ・OS:Windows2000 よろしくお願いいたします。 |
|
投稿日時: 2005-08-05 11:39
続報です。
該当の処理をいろいろ分けて試してみた結果です。 ○ @BLOB→ABLOB ○ @FILE→ABLOB (ファイルはディスク上にある) × @BLOB→AFILE→BBLOB (少なくともAまではうまく行っています) でいうが分けてればどちらもうまく動いているように見ます。 ますますわからなくなってきています。。。 |
|
投稿日時: 2005-08-05 15:01
標準でないクラスの利用によりソースの公開を控えた事情は了解いたしました。
一つ疑問がありますので、この辺りを確認すると少し道が開けるかもしれません。 (確証はありませんが(_ _)) ・BLOB→FILE→BLOBのパターンで、トランザクションは BLOB→FILE と FILE→BLOB の二つに分けているか、それとも一トランザクションで実行しているか。 もしもファイルをメモリ内バッファと同じように扱い、書き込みが完了していない状態で一トランザクション内で書き込みと読み込みを交互に行っているようでしたら、それは止めた方が懸命と思われます。 二トランザクションに分離しているのに通らないとすれば、何らかの使いまわしてはいけないリソースを使いまわしたとか、結合テスト一般で発生する問題に該当しているのかもしれません。 二トランザクションに分離し、メソッド自体も分けているのに続けて呼んだ場合だけ通らないというのであれば私にはお手上げでございます(_ _;) |
|
投稿日時: 2005-08-05 16:20
Gioさん、ご回答ありがとうございました。
何とか解決策が見つかりました。 (上記に言った通り、BLOB→BLOBならできるってことを確認しています。) 最初、FILE→BLOBのバッチ処理があるため、性能面の考慮で、 BLOB→FILE→BLOBのパターンで行こうと考えてましたが、やはりBLOB→BLOBの方式に 変更しちゃいました。(後日、性能わるいぞって言われるかもしれませんが。) 理由、ミドルウェアを使っているため、コーディング時に、 いろんな制約を受けています。いまさら、二つのトランザクションに分離し、 メッソドも分けるとすると、リコーディングのボリュームは大きくなるからです。 自分もファイルの書込みが終ってないまま、 次の読込みが始まってしまうのでは?と思っています。 …が、初心者ですので、そこらへんの検証はどうやってできるのは知りません。です。(汗 |
|
投稿日時: 2005-08-05 18:07
ファイルを経由すると、BLOB→BLOB の場合と比べてディスク I/O が余分に発生します。
ストリーム転送がオンメモリで実現できているなら、状況にもよりますが、そちらの方が良いと思います。 やや疑問点は残りますが、何はともあれ当初の問題の解決策を見つけられたようでおめでとうございます |