我正在批处理 tasklet 中从 Oracle (SQL) DB 检索 BLOB。 为了将底层文件作为字节[],我使用了这样的东西:
byte[] blobAsByte = blob.getBytes(1l, (int) blob.length());
并将此与适当的 mime 类型传递到数据源中。
问题是,返回的长度以及返回的字节代表“prefetchdata”的内容,而不是我在调试和查看 blob 对象包含的内容时发现的实际数据。
你能告诉我,我怎样才能检索到实际数据吗?
这个结构在 java 中是否代表一个合适的 blob 对象:
Name: blob
Value: $Proxy377
Name: h
Value: SerializableBlobProxy
Name: blob
Delegate: DelegatingBlob
Name: delegate
Value: BLOB
Name: OjiOracleBlob
Name: data
Value:[0]...[113]
Name: prefetchData
Value:[0]...[5]
要从 BLOB 读取,请使用 oracle.sql.BLOB 对象的
getBinaryStream()
方法检索整个 BLOB 作为输入流。这将返回一个 java.io.InputStream
对象。
与任何 InputStream
对象一样,使用重载的 read()
方法之一读取 LOB 数据,并在完成后使用 close()
方法。 (或者从 Java 9 使用readAllBytes()
)
在您的情况下,以下内容应该有效:
byte[] blobAsByte = blob.getBinaryStream().readAllBytes();
您可以完全禁用 BLOB 数据的预取
oracle.jdbc.defaultLobPrefetchSize=-1
或将其设置为所需的字节大小,例如 4k
oracle.jdbc.defaultLobPrefetchSize=4000