Blob 对象通过 blob.getBytes() 返回预取数据而不是字节码

问题描述 投票:0回答:2

我正在批处理 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]
java sql arrays oracle blob
2个回答
0
投票

要从 BLOB 读取,请使用 oracle.sql.BLOB 对象的

getBinaryStream()
方法检索整个 BLOB 作为输入流。这将返回一个
java.io.InputStream
对象。 与任何
InputStream
对象一样,使用重载的
read()
方法之一读取 LOB 数据,并在完成后使用
close()
方法。 (或者从 Java 9 使用
readAllBytes()

在您的情况下,以下内容应该有效:

byte[] blobAsByte = blob.getBinaryStream().readAllBytes();

0
投票

您可以完全禁用 BLOB 数据的预取

oracle.jdbc.defaultLobPrefetchSize=-1

或将其设置为所需的字节大小,例如 4k

oracle.jdbc.defaultLobPrefetchSize=4000
© www.soinside.com 2019 - 2024. All rights reserved.