Java + PostgreSQL で BLOB を扱う その 2
出た! (;´ー`)y─┛~~
前回、InputStream を使って巨大データを BYTEA 型カラムに格納出来たわけだが、今度は保存した内容を取り出すタイミングで再び OutOfMemoryError が姿を現した。
なんだかすごーく嫌な予感がするのだが… とりあえず 8.1 ドライバのソースでも見てみるか。
public InputStream getBinaryStream(int columnIndex) |
. .: : : : : : : : :: :::: :: :: : :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
. . : : : :: : : :: : ::: :: : :::: :: ::: ::: ::::::::::::::::::::::::::::::::::::::
. . .... ..: : :: :: ::: :::::: :::::::::::: : :::::::::::::::::::::::::::::::::::::::::::::
Λ_Λ . . . .: : : ::: : :: ::::::::: :::::::::::::::::::::::::::::
/:彡ミ゛ヽ;)ー、 . . .: : : :::::: :::::::::::::::::::::::::::::::::
/ :::/:: ヽ、ヽ、 ::i . .:: :.: ::: . :::::::::::::::::::::::::::::::::::::::
/ :::/;;: ヽ ヽ ::l . :. :. .:: : :: :: :::::::: : ::::::::::::::::::
 ̄ ̄ ̄(_,ノ  ̄ ̄ ̄ヽ、_ノ ̄ ̄ ̄ ̄
どう見ても設計者の手抜きか設計の甘さを 「サーバからストリームで値を取り出せないので結局 getBytes() を呼ぶことになります」 とは言い訳がましい。getBinaryStream() の仕様をよく見ろ、別チャンネルでストリーム参照できる必要は全く無いし getBytes() が実装できてこれが出来ないわけがない。
多分 next() が呼ばれたタイミングで次の行のレコードを一回全部配列か何かに読み込んでるんだろうな。ざっと 8.1 のソースを眺めてみたが回避策はなさそうだ。やはり Java から PostgreSQL の Blob を扱うのは無理なのか。
だがそこに一筋の光が!