OracleテーブルでデータタイプBLOB
を使用して、画像とドキュメントファイルを格納しています。 Postgres(9.4.5)の場合、BYTEA
またはOID
の2つのオプションがあります。
次のようにJava側からパラメータ(SAVING)を渡すことを考慮します。
DiskFileItemDeepy file = myFile;
InputStream is = null;
long fileSize = 0;
if (file != null && file.getFileSize() > 0){
is = file.getInputStream();
fileSize = file.getFileSize();
call.setBinaryStream(1, (InputStream)is, (long)fileSize);
}
...
call.execute();
//When retrieve the data use:
Java.sql.Blob blob = (Blob) resultSet.getBlob(tableColumnName);
上記の目的のために、どのPostgresデータ型がBLOB
の置換のより良い候補ですか、それはBYTEA
またはOID
ですか?
概念的な観点から見ると、OracleのBLOB
データ型に相当するものは、Postgresではbytea
です。
bytea
はcompleteデータの読み取りと書き込みのみを許可します(1GBの値から100KBを取得することはできません)。つまり、JVMを読み取る間、これはJVMのメモリに保持されます。これは、OracleのBLOB
型と同じです。 JDBCの観点からは、これら2つのデータ型の動作はほぼ同じです。
OID(またはそれ以上: "ラージオブジェクト")は実際の "データタイプ"ではありません。これは、ファイルシステムに格納されているデータへのポインタにすぎません。ラージオブジェクトを使用する利点サーバーからクライアントにコンテンツを適切にストリーミングできるため、バイナリデータ全体をクライアントのメモリにロードする必要がありません。
ただし、ラージオブジェクトの処理は、bytea
列の処理よりもはるかに複雑です。また、ベーステーブルから対応する行を削除する場合は、削除したラージオブジェクトを手動クリーンアップする必要があります(bytea
で行う必要のないもの)。ラージオブジェクトの読み取りと書き込みも、bytea
値を処理するよりもはるかに複雑です。
現在BLOB
列を使用しているため、クライアント側にデータを処理するためのメモリがあるようです。その場合、移行をできるだけスムーズにするために、Postgresでbytea
を使用することを強くお勧めします。