2010年2月7日日曜日

【Oracle】JDBC経由でBLOBデータ取得

JDBC経由でBLOBデータを更新する場合は、JCBC経由でBLOBデータ挿入を参照。

JDBC経由でBLOBデータを参照するにはいくつかの方法があると思うので、パターンごとに実装方法をまとめてみた。

取得されるサイズが少量の場合

データベース上のBLOBのサイズが小さい場合は、ResultSet#getBytesを使って一括でメモリ上に展開するのが良いと思う。
実際にのコードは、こんな感じになる。
PreparedStatement statement = con.prepareStatement( 
        "select blob_data FROM blob_test where id = ?"); 
try { 
    statement.setString(1, "01"); 
    ResultSet set = statement.executeQuery(); 
    if (set.next()) { 
        // ResultSet#getBytesを呼び出して、BLOBのデータを取得する。 
        byte[] bytes = set.getBytes(1); 
    } 
} finally { 
    statement.close(); 
}


取得されるサイズが大きい場合

取得されるBLOBのサイズが大きくなる場合(例えばファイルをBLOBのカラムに格納していた場合)は、メモリ上にすべてのデータを展開するとヒープを圧迫するのでよろしくない。
このような場合は、一定サイズを読み込みつつファイルなどに落としてあげるのが良い。
コードは、こんな感じ。Blobから取得したInputStreamからデータを読み込んでファイルなどに出力してあげれば良い。
PreparedStatement statement = con.prepareStatement( 
        "select blob_data FROM blob_test where id = ?"); 
try { 
    statement.setString(1, "01"); 
    ResultSet set = statement.executeQuery(); 
    if (set.next()) { 
        // getBlobを呼び出し、Blobオブジェクトを取得する。 
        Blob blob = set.getBlob(1); 

        // BlobオブジェクトからInputStreamを取得 
        InputStream stream = blob.getBinaryStream(); 
        printFile(stream); 
    } 
} finally { 
    statement.close(); 
}