- - PR -
WebLogic8.1+Oracle9.1でのBLOBデータ書き込み
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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クラスを使うことで逃げているのですが、 さすがに非推奨にクラスを使い続けるわけにもいかず…。 解決方法を知っておられる方がいましたら教えていただけると助かります。 よろしくお願いします。 | ||||||||
|
投稿日時: 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 あと、せっかく商用製品をご利用になっているのですからマニュアルを読んでわからない点があればご購入先のサポート窓口に問い合わせてはいかがでしょうか? | ||||||||
|
投稿日時: 2004-11-25 11:40
OCIドライバ(タイプ2)を使えば、JDBC標準の方法でBLOBデータを挿入できますよ。
PreparedStatement stmt = con.prepareStatement("insert into ..."); ... stmt.setBinaryStream(1, stream, length); stmt.executeUpdate(); | ||||||||
|
投稿日時: 2004-11-25 12:32
絶対にキャストしないとダメなのですか? java.sql.Blobインターフェイスが所有するメソッド経由で書き込み出来ませんかね? #setBynaryStream()とか。 それなら簡単に済みそうですよね。 APサーバのJNDIディレクトリに登録しておいたDataSourceを経由してRDBMSと接続する場合、 アプリケーション層でJNDIをルックアップして得られるDataSourceインスタンスを通して 取り出せるJDBC各インターフェイスの実装クラスは、使用するJDBCドライバが各々持って いる実装クラス型ではなくて、そのクラスオブジェクトをラップするAPサーバ独自のJDBC ラッパークラスであることが多いようなので、多分その類ではないかと思います。 rs.getBlob().getClass().getName()してみれば、おそらくWLS由来のクラス名が返るのでは。 もしラップしているJDBCドライバクラスの取り出し方が必要ならば、それはわからないので BEAに質問してください^^; #動けばいいだけなら、リフレクションで無理やり隠蔽しているフィールドを引っ張り出す手も #あるのですけれど…おそらくそのような行為はサポート対象外ですといわれるでしょうねぇ^^; [追記]
それなら違う問題ですよね。すみません。 [ メッセージ編集済み 編集者: シュン 編集日時 2004-11-25 15:37 ] | ||||||||
|
投稿日時: 2004-11-25 13:04
はじめまして。
私はWebLogic7(+Oracle Thinドライバ)でしか動かしてないですが、参考までに。 私は、getBlobの結果をweblogic.jdbc.vendor.oracle.OracleThinBlobに キャストし、OracleThinBlob#getBinaryOutputStreamを使ってStreamを取得し、 実際に書き込むといったことをやってます。 確かBEAのページに載っていたと思いますよ。 #WLS8で非推奨になっているかもしれませんが・・・ | ||||||||
|
投稿日時: 2004-11-26 16:15
皆様、貴重なアドバイスありがとうございました。
皆様から頂いた情報を基にいろいろと試した結果、 OracleBlobクラスの代わりにOracleThinBlobクラスを 使用することで問題は解決しました。 本当にありがとうございました。 |
1