将 Oracle 中的 BLOB 迁移到 PostgreSQL

sco*_*ott 3 postgresql oracle migration blob postgresql-9.4

我使用BLOBOracle 表中的数据类型来存储图像和文档文件。现在对于 Postgres(9.4.5),我有两个选择,即,BYTEAOID.

考虑到从 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);  
Run Code Online (Sandbox Code Playgroud)

出于上述目的,哪种 Postgres 数据类型更适合替换BLOB,是BYTEA还是OID

a_h*_*ame 7

从概念的角度来看,相当于 Oracle 的BLOB数据类型bytea在 Postgres 中。

bytea只允许您读取和写入完整数据(您不能仅从 1GB 值中检索 100KB)。这意味着它在读取时保存在 JVM 的内存中。这与 Oracle 的BLOB类型相同。从 JDBC 的角度来看,这两种数据类型的行为几乎相同。

OID(或者更好:“大对象”)不是真正的“数据类型”。它只是一个指向存储在文件系统中的数据的指针。使用大对象的优点是可以正确地将内容从服务器流式传输到客户端,而无需将整个二进制数据加载到客户端的内存中。

然而,处理大对象比处理bytea列复杂得多。如果您从基表中删除了相应的行,您还需要手动清理已删除的大对象(您不需要这样做bytea)。大对象的读写也比处理bytea值复杂得多。

由于您目前正在使用一BLOB列,因此您显然在客户端有内存来处理数据,在这种情况下,为了使转换尽可能顺利,我强烈建议bytea在 Postgres 中使用。