fc2ブログ
ホーム   »  データベース/JDBC  »  Java + PostgreSQL で BLOB を扱う その 2

Java + PostgreSQL で BLOB を扱う その 2

出た! (;´ー`)y─┛~~

前回、InputStream を使って巨大データを BYTEA 型カラムに格納出来たわけだが、今度は保存した内容を取り出すタイミングで再び OutOfMemoryError が姿を現した。

なんだかすごーく嫌な予感がするのだが… とりあえず 8.1 ドライバのソースでも見てみるか。

public InputStream getBinaryStream(int columnIndex)
    throws SQLException
{
    // ...
    if (connection.haveMinimumCompatibleVersion("7.2")){
        // Version 7.2 supports BinaryStream for
        //
all PG bytea type As the spec/javadoc for
        // this method indicate this is to be used for
        //large binary values (i.e. LONGVARBINARY)
        // PG doesn't have a separate long binary
        // datatype, but with toast the bytea datatype is
        // capable of handling very large values.  Thus
        // the implementation ends up calling getBytes()
        // since there is no current way to stream the
        // value from the server
        byte b[] = getBytes(columnIndex);
        if (b != null)
            return new ByteArrayInputStream(b);
    } else {
        // 7.1 以前の場合
    }
    return null;
}
 

. .: : : : : : : : :: :::: :: :: : :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    . . : : : :: : : :: : ::: :: : :::: :: ::: ::: ::::::::::::::::::::::::::::::::::::::
   . . .... ..: : :: :: ::: :::::: :::::::::::: : :::::::::::::::::::::::::::::::::::::::::::::
        Λ_Λ . . . .: : : ::: : :: ::::::::: :::::::::::::::::::::::::::::
       /:彡ミ゛ヽ;)ー、 . . .: : : :::::: :::::::::::::::::::::::::::::::::
      / :::/:: ヽ、ヽ、 ::i . .:: :.: ::: . :::::::::::::::::::::::::::::::::::::::
      / :::/;;:   ヽ ヽ ::l . :. :. .:: : :: :: :::::::: : ::::::::::::::::::
 ̄ ̄ ̄(_,ノ  ̄ ̄ ̄ヽ、_ノ ̄ ̄ ̄ ̄

 

どう見ても設計者の手抜きか設計の甘さを 「サーバからストリームで値を取り出せないので結局 getBytes() を呼ぶことになります」 とは言い訳がましい。getBinaryStream() の仕様をよく見ろ、別チャンネルでストリーム参照できる必要は全く無いし getBytes() が実装できてこれが出来ないわけがない。

多分 next() が呼ばれたタイミングで次の行のレコードを一回全部配列か何かに読み込んでるんだろうな。ざっと 8.1 のソースを眺めてみたが回避策はなさそうだ。やはり Java から PostgreSQL の Blob を扱うのは無理なのか。

 

だがそこに一筋の光が!

続く!!

コメント
トラックバック
トラックバック URL
コメントの投稿
管理者にだけ表示を許可する
Profile
Takami Torao
Takami Torao
C/C++ 使いだった 1996年、運命の Java と出会い現在に至る。のらアーキテクト。
Yah, this is image so I don't wanna eat spam, sorry!
Search

Google
MOYO Laboratory
Web

カテゴリー
最近の記事
最近のコメント
最近のトラックバック
月別アーカイブ
ブロとも申請フォーム
RSSフィード
リンク