- PR -

WebLogic8.1+Oracle9.1でのBLOBデータ書き込み

1
投稿者投稿内容
エヌ
会議室デビュー日: 2003/04/09
投稿数: 15
投稿日時: 2004-11-25 10:38
WebLogic8.1上のサーブレットからOracle9.1のBLOBフィールドに
ファイルを登録したいのですが途中で例外が発生してしまい、
正常に登録できないで困っています。

手順としてはOracleにファイルを登録するセオリー通り、

1.レコードをINSERT(BLOBフィールドにはEMPTY_BLOB()で空データを登録)
2.INSERTしたレコードをSLELCT、rs.getBlob()でBLOBフィールドを取得
3.取得したBLOBフィールドをoracle.sql.BLOB型にキャストし、getBinaryOutputStream()でOutputStream取得

と言う手順で行っているのですが3のBLOB型にキャストした時点で
ClassCastExceptionが発生してしまい、異常終了してしまいます。


そこでもう少し調べ、
http://edocs.beasys.co.jp/e-docs/wls/docs81/faq/jdbc.html#501389
上記のサイトを見つけ、試してみたのですがgetBLOB()を実行した時点で
ClassCastExceptionが発生し、異常終了してしまいます。
(OracleResulstSetへのキャストはうまくいってるみたいなのですが。)


更に調べ、最初の方法でキャストする際、oracle.sql.BLOB型ではなく、weblogic.jdbc.common.OracleBlob型にキャストすれば良いと言う記事を
見つけ、試した結果、処理自体は正常に終了したのですが、
OracleBlobクラスはWebLogic8.1で非推奨となっているため、
「使用すべきではありません。」と警告が出てしまいます。


現在はOracleBlobクラスを使うことで逃げているのですが、
さすがに非推奨にクラスを使い続けるわけにもいかず…。
解決方法を知っておられる方がいましたら教えていただけると助かります。
よろしくお願いします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-11-25 10:47
WLS のドキュメントはかなりのボリュームがありますが、以下のページで検索すると大抵のことはわかりますよ。
・BEA Search
http://search.beasys.co.jp/cgi-bin/namazu.cgi?query=&submit=Search%21&whence=0&max=10&result=normal&sort=score&idxname=e-docs%2Fwls%2Fdocs81
・BEA powered by Google
http://google.bea.com

こんなところでしょうか?
http://edocs.beasys.co.jp/e-docs/wls/docs81/jdbc/thirdparty.html#1043705
http://edocs.beasys.co.jp/e-docs/wls/docs81/jdbc/thirdparty.html#1078159
http://edocs.beasys.co.jp/e-docs/wls/docs81/jdbc/thirdparty.html#physical_connection

あと、せっかく商用製品をご利用になっているのですからマニュアルを読んでわからない点があればご購入先のサポート窓口に問い合わせてはいかがでしょうか?
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-11-25 11:40
OCIドライバ(タイプ2)を使えば、JDBC標準の方法でBLOBデータを挿入できますよ。

PreparedStatement stmt = con.prepareStatement("insert into ...");
...
stmt.setBinaryStream(1, stream, length);
stmt.executeUpdate();
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2004-11-25 12:32
引用:

手順としてはOracleにファイルを登録するセオリー通り、

1.レコードをINSERT(BLOBフィールドにはEMPTY_BLOB()で空データを登録)
2.INSERTしたレコードをSLELCT、rs.getBlob()でBLOBフィールドを取得
3.取得したBLOBフィールドをoracle.sql.BLOB型にキャストし、getBinaryOutputStream()でOutputStream取得

と言う手順で行っているのですが3のBLOB型にキャストした時点で
ClassCastExceptionが発生してしまい、異常終了してしまいます。



絶対にキャストしないとダメなのですか?
java.sql.Blobインターフェイスが所有するメソッド経由で書き込み出来ませんかね?
#setBynaryStream()とか。
それなら簡単に済みそうですよね。

APサーバのJNDIディレクトリに登録しておいたDataSourceを経由してRDBMSと接続する場合、
アプリケーション層でJNDIをルックアップして得られるDataSourceインスタンスを通して
取り出せるJDBC各インターフェイスの実装クラスは、使用するJDBCドライバが各々持って
いる実装クラス型ではなくて、そのクラスオブジェクトをラップするAPサーバ独自のJDBC
ラッパークラスであることが多いようなので、多分その類ではないかと思います。

rs.getBlob().getClass().getName()してみれば、おそらくWLS由来のクラス名が返るのでは。

もしラップしているJDBCドライバクラスの取り出し方が必要ならば、それはわからないので
BEAに質問してください^^;
#動けばいいだけなら、リフレクションで無理やり隠蔽しているフィールドを引っ張り出す手も
#あるのですけれど…おそらくそのような行為はサポート対象外ですといわれるでしょうねぇ^^;

[追記]
引用:

(OracleResulstSetへのキャストはうまくいってるみたいなのですが。)


それなら違う問題ですよね。すみません。

[ メッセージ編集済み 編集者: シュン 編集日時 2004-11-25 15:37 ]
daisuke_imai
会議室デビュー日: 2003/05/12
投稿数: 5
投稿日時: 2004-11-25 13:04
はじめまして。

私はWebLogic7(+Oracle Thinドライバ)でしか動かしてないですが、参考までに。

私は、getBlobの結果をweblogic.jdbc.vendor.oracle.OracleThinBlobに
キャストし、OracleThinBlob#getBinaryOutputStreamを使ってStreamを取得し、
実際に書き込むといったことをやってます。
確かBEAのページに載っていたと思いますよ。

#WLS8で非推奨になっているかもしれませんが・・・
エヌ
会議室デビュー日: 2003/04/09
投稿数: 15
投稿日時: 2004-11-26 16:15
皆様、貴重なアドバイスありがとうございました。

皆様から頂いた情報を基にいろいろと試した結果、
OracleBlobクラスの代わりにOracleThinBlobクラスを
使用することで問題は解決しました。


本当にありがとうございました。
1

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