web-dev-qa-db-ja.com

OracleのBLOBをPostgreSQLに移行する

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ですか?

3
scott

概念的な観点から見ると、OracleのBLOBデータ型に相当するものは、Postgresではbyteaです。

byteacompleteデータの読み取りと書き込みのみを許可します(1GBの値から100KBを取得することはできません)。つまり、JVMを読み取る間、これはJVMのメモリに保持されます。これは、OracleのBLOB型と同じです。 JDBCの観点からは、これら2つのデータ型の動作はほぼ同じです。

OID(またはそれ以上: "ラージオブジェクト")は実際の "データタイプ"ではありません。これは、ファイルシステムに格納されているデータへのポインタにすぎません。ラージオブジェクトを使用する利点サーバーからクライアントにコンテンツを適切にストリーミングできるため、バイナリデータ全体をクライアントのメモリにロードする必要がありません。

ただし、ラージオブジェクトの処理は、bytea列の処理よりもはるかに複雑です。また、ベーステーブルから対応する行を削除する場合は、削除したラージオブジェクトを手動クリーンアップする必要があります(byteaで行う必要のないもの)。ラージオブジェクトの読み取りと書き込みも、bytea値を処理するよりもはるかに複雑です。

現在BLOB列を使用しているため、クライアント側にデータを処理するためのメモリがあるようです。その場合、移行をできるだけスムーズにするために、Postgresでbyteaを使用することを強くお勧めします。