- PR -

CLOBへの書き込みについて

投稿者投稿内容
ヘルプミー
会議室デビュー日: 2005/04/21
投稿数: 13
投稿日時: 2005-08-04 21:25
こんばんは。
自分の場合も類似な問題に遭遇していますので、
このスレに書かせていただきました。

現在、テーブルにあるBLOB型のデータを取得し、
別のテーブルに保存しようとしていますが、うまく行ってません。
(commitした後はテーブルの該当コラムにnullのままでした。)

手順は下記です。

@BLOBのデータを取得し、ディスクにファイルを作成する。
A空のBLOB(empty_blob)を作成する。
BgetBinaryOutputStreamで空のBLOBのストリーム(書込み用)を得る。
C上記@にて作成されているファイルのストリーム(読込み用)を取得する。
Dデータの書込み(C→B)を行う。
Ecommit

確認したところ、ドライバ等には特に問題ないと思います。
ディスク上にファイルが作成されることを確認しています。

どなたがその原因がわかれば、ご教示していただきたいのです。
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2005-08-04 22:11
差し支えなければプログラムの該当部分をコピー&ペーストしていただけますか。
ヘルプミーさんの書かれた手順はあくまでヘルプミーさんの思う意図であって、実際のプログラムがその意図に即していないおそれがあります。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-08-04 22:33
ヘルプミーさんはどんな環境でしょうか?
・DBサーバ
・バージョン
・ドライバ
・OS
ヘルプミー
会議室デビュー日: 2005/04/21
投稿数: 13
投稿日時: 2005-08-05 11:19
Gioさん、かつのりさん、ご返事ありがとうございます。

→Gioさんへ

Gioさんのおっしゃっている内容より、その手順には特に
問題なさそうな気がしますが、よろしいでしょうか?

こちらの環境では、javaのスタンダードクラスではなく、
第三者にいただいたミドルウェアが使われてますので、
該当のソースを貼り付けても、あまり読めない部分も結構あるか
とも思いますので…申し訳ないです。

一応上記に書かれてある「ディスクにファイルを作成する。」
という処理をなくして、BLOB→BLOBのように試してみた結果OKでした。

 ・この前ディスク上にファイルを作成することができる、
 ・デバッグした結果、ちゃんとファイルから読込み用のストリームは取っている

…ということで、その後のどっかに問題あるのかなと考えていますが、
(というのは上記Dにはあやしいことがある??)
いまだに何も見つけていません。

→かつのりさんへ

環境関連の情報は下記のとおりです。

 ・DBサーバ:Oracle9i
 ・バージョン:JDK1.4.2
 ・ドライバ:JDBC
 ・OS:Windows2000

よろしくお願いいたします。
ヘルプミー
会議室デビュー日: 2005/04/21
投稿数: 13
投稿日時: 2005-08-05 11:39
続報です。

該当の処理をいろいろ分けて試してみた結果です。

○ @BLOB→ABLOB
○ @FILE→ABLOB        (ファイルはディスク上にある)
× @BLOB→AFILE→BBLOB  (少なくともAまではうまく行っています)

でいうが分けてればどちらもうまく動いているように見ます。
ますますわからなくなってきています。。。
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2005-08-05 15:01
標準でないクラスの利用によりソースの公開を控えた事情は了解いたしました。

一つ疑問がありますので、この辺りを確認すると少し道が開けるかもしれません。
(確証はありませんが(_ _))

・BLOB→FILE→BLOBのパターンで、トランザクションは BLOB→FILE と FILE→BLOB の二つに分けているか、それとも一トランザクションで実行しているか。

もしもファイルをメモリ内バッファと同じように扱い、書き込みが完了していない状態で一トランザクション内で書き込みと読み込みを交互に行っているようでしたら、それは止めた方が懸命と思われます。

二トランザクションに分離しているのに通らないとすれば、何らかの使いまわしてはいけないリソースを使いまわしたとか、結合テスト一般で発生する問題に該当しているのかもしれません。

二トランザクションに分離し、メソッド自体も分けているのに続けて呼んだ場合だけ通らないというのであれば私にはお手上げでございます(_ _;)
ヘルプミー
会議室デビュー日: 2005/04/21
投稿数: 13
投稿日時: 2005-08-05 16:20
Gioさん、ご回答ありがとうございました。

何とか解決策が見つかりました。
(上記に言った通り、BLOB→BLOBならできるってことを確認しています。)

最初、FILE→BLOBのバッチ処理があるため、性能面の考慮で、
BLOB→FILE→BLOBのパターンで行こうと考えてましたが、やはりBLOB→BLOBの方式に
変更しちゃいました。(後日、性能わるいぞって言われるかもしれませんが。)

理由、ミドルウェアを使っているため、コーディング時に、
いろんな制約を受けています。いまさら、二つのトランザクションに分離し、
メッソドも分けるとすると、リコーディングのボリュームは大きくなるからです。

自分もファイルの書込みが終ってないまま、
次の読込みが始まってしまうのでは?と思っています。
…が、初心者ですので、そこらへんの検証はどうやってできるのは知りません。です。(汗
Gio
ぬし
会議室デビュー日: 2003/11/28
投稿数: 350
お住まい・勤務地: 都内から横浜の間に少量発生中
投稿日時: 2005-08-05 18:07
ファイルを経由すると、BLOB→BLOB の場合と比べてディスク I/O が余分に発生します。
ストリーム転送がオンメモリで実現できているなら、状況にもよりますが、そちらの方が良いと思います。

やや疑問点は残りますが、何はともあれ当初の問題の解決策を見つけられたようでおめでとうございます

スキルアップ/キャリアアップ(JOB@IT)