在 Oracle 数据库适配器中流式处理大型对象数据类型

适用于 Oracle 数据库的 Microsoft BizTalk 适配器支持流式处理 Oracle 大型对象 (LOB) 数据类型。 使用 Oracle 数据库适配器,调用操作并通过交换 SOAP 消息返回响应。 SOAP 消息正文由 XML 节点组成。

适配器支持两种类型的消息流式处理:

  • 节点流式处理。 在节点流式处理中,每个节点在发送到 Oracle 数据库 (或返回到客户端) 之前,由适配器缓冲。 这意味着,对于 LOB 数据类型,整个值将读入缓冲区。

  • 节点值流式处理。 在节点值流式处理中,节点的实际值可以在 Oracle 数据库和客户端之间以区块形式进行流式传输。 节点值流式处理支持适配器客户端和 Oracle 数据库之间的 LOB 数据类型的端到端流式处理。

    这两种流模式都依赖于对 WCF 中消息的节点流式处理和节点值流式处理的支持。 因此,LOB 类型的流式处理与适配器和客户端应用程序创建和使用消息的方式密切相关。 其一个结果是,在所有编程模型中,对流式处理 LOB 类型的支持并不相同。

    本主题中的部分提供:

  • 有关 WCF 中如何支持消息流以及适配器如何实现消息流的基本背景信息。

  • 有关在每个编程模型中使用适配器时如何支持 LOB 数据类型的流式处理的信息。

流式处理基础知识

Oracle 数据库适配器实现的流式处理支持包括:

  • WCF 中的消息流式处理支持。

  • Oracle 客户端库中的流式处理支持 (ODP.NET) 。

  • 适配器在内部创建和使用消息的方式。

WCF 中的消息流式处理支持

WCF 如何支持对消息进行流式处理,取决于消息的创建方式和使用消息的方式。

  • WCF 消息是使用 System.ServiceModel.Channels.Message 的静态 Create 方法创建的。 此方法有多个重载,这些重载支持传递消息正文的不同方式。 可以通过使用以下方法传递消息正文来创建 WCF 消息:

    • System.Xml。XmlReader,或

    • System.ServiceModel.Channels.BodyWriter

  • 可以使用 WCF 消息

    • 通过调用Message.GetReaderAtBodyContents ()

    • 通过调用 Message.WriteBodyContents (XmlDictionaryWriter) 的 XmlDictionaryWriter

    下表显示了 WCF 对于创建和使用消息的不同组合的行为方式。

使用 创建的消息 消息使用 WCF 行为
XmlBodyWriter XmlDictionaryWriter 支持节点值流式处理。 WCF 通过管道将两个写入器一起启用流式处理。 XmlBodyWriterXmlDictionaryWriter 都必须支持节点值流式处理才能发生。
XmlBodyWriter XmlReader 支持节点流式处理。 WCF 在内部缓冲 XmlReader
XmlReader XmlDictionaryWriter 支持节点流式处理。 WCF 在内部缓冲 XmlReader 并调用回 XmlDictionaryWriter
XmlReader XmlReader 支持节点流式处理。 WCF 在内部缓冲 XmlReader

Oracle 客户端库中的流式处理支持 (ODP.NET)

ODP.NET 支持通过以下方式进行流式处理:

  • 仅 Oracle LOB 数据类型支持流式处理。

  • 对于某些表 (和视图) 操作,LOB 数据类型是缓冲的。 因此,不支持流式处理。

适配器的内部消息处理

适配器支持按以下方式进行流式处理:

  • 适配器扩展 Message 以实现自定义消息类 Microsoft.Adapters.AdapterUtilities.AdapterMessage。 它为它提供给适配器客户端的所有 WCF 消息创建 AdapterMessage ;这包括所有出站操作的响应消息和 POLLINGSTMT 操作的请求消息。 这样,适配器就可以通过向适配器客户端提供支持 ReadValueChunkXmlReader 来支持 ReadLOB 操作的节点值流式处理。

  • 适配器使用 XmlDictionaryWriter 的自定义实现从客户端接收的所有消息。

  • 适配器使用 XmlBodyWriter 的自定义实现创建发送到客户端的所有消息,ReadLOB 响应消息除外。 (这包括所有出站操作的响应消息和 POLLINGSTMT 操作的请求消息。)

WCF 通道模型中的流式处理支持

下表提供了 WCF 通道模型中如何支持流式处理的详细信息。

操作 节点流式处理 Node-Value 流式处理 说明
表插入操作 支持* 适配器和 Oracle 数据库之间不支持。 在客户端和适配器之间受支持。* 不支持端到端节点值流式处理,因为 LOB 列的值由 ODP.NET 缓冲,然后执行插入。 但是,如果客户端使用 BodyWriter 创建消息,则 LOB 列可以在客户端和适配器之间进行节点值流式处理。
表选择操作 支持 支持 适配器使用 BodyWriter 创建响应消息。 如果客户端使用 XmlDictionaryWriter 使用消息,则 LOB 列的节点值流式处理将发生。
表更新操作 支持 适配器和 Oracle 数据库之间不支持。 在客户端和适配器之间受支持。 不支持端到端节点值流式处理,因为 LOB 列的值由 ODP.NET 缓冲,然后执行更新。 但是,如果客户端使用 BodyWriter 创建消息,则 LOB 列可以在客户端和适配器之间进行节点值流式处理。
表删除操作 支持 适配器和 Oracle 数据库之间不支持。 在客户端和适配器之间受支持。 不支持端到端节点值流式处理,因为 LOB 列的值通过 ODP.NET 缓冲,然后执行删除。 但是,如果客户端使用 BodyWriter 创建消息,则 LOB 列可以在客户端和适配器之间进行节点值流式处理。
表读取LOB 操作 支持 支持 ReadLOB 操作主要用于流式传输 WCF 服务模型中的 LOB 数据列。 在 WCF 通道模型中,如果客户端通过在响应消息) 调用 GetReaderAtBodyContents 方法来使用 XmlReader (消息,则会发生端到端节点值流式处理。 这是因为适配器返回支持 ReadLOB 响应消息的 ReadValueChunk 调用的 XmlReader。 但是,建议不要使用 WCF 通道模型中的 ReadLOB 操作。 可以改用 Select 操作或 SQLEXECUTE 操作。
表更新LOB 操作 支持 支持 适配器使用 XmlDictionaryWriter 来使用请求消息。 如果客户端使用 BodyWriter 创建请求消息,则 LOB 数据的端到端节点值流式处理将发生。
SQLEXECUTE 操作 支持 支持 适配器使用 BodyWriter 创建响应消息。

如果客户端使用 XmlDictionaryWriter 来使用响应消息,则 LOB 数据的端到端节点值流式处理将发生。

请求消息不支持端到端节点值流式处理,因为适配器必须先缓冲所有操作数,然后才能对 Oracle 数据库调用操作。
存储过程和函数操作 支持 支持 适配器使用 BodyWriter 创建响应消息。

如果客户端使用 XmlDictionaryWriter 来使用响应消息,则 LOB 数据的端到端节点值流式处理将发生。 (这意味着响应 message 中的 OUT 和 IN OUT 过程和函数参数支持流式处理。)

请求消息不支持端到端节点值流式处理,因为适配器必须先缓冲所有操作数,然后才能对 Oracle 数据库调用操作。
POLLINGSTMT 操作 支持 支持 适配器使用 BodyWriter 创建 POLLINGSTMT 请求消息。 如果客户端使用 XmlDictionaryWriter 使用消息,则 LOB 列的节点值流式处理将发生。

有关如何在使用 WCF 通道模型时在代码中实现 LOB 数据流的信息,请参阅 使用 WCF 通道模型流式处理 Oracle 数据库 LOB 数据类型

WCF 服务模型中的流式处理支持

在消息的 XML 表示形式与该消息的托管代码对象表示形式之间序列化和反序列化需要将整个消息写入和读取到内存中。 因此,大多数操作都不支持节点流式处理和节点值流式处理。

唯一的例外是 ReadLOB 操作。 实现此操作专门是为了支持在 WCF 服务模型中读取表和查看 LOB 列的端到端流式处理。

BizTalk Server 中的流式处理支持

下表提供了BizTalk Server中如何支持流式处理的详细信息。 (所有对“适配器”的引用都指 Oracle 数据库适配器;WCF-Custom 适配器始终在此表中由其全名引用。)

操作 节点流式处理 Node-Value 流式处理 说明
表插入操作 支持* 适配器和 Oracle 数据库之间不支持;但是,数据在BizTalk Server和适配器之间流式传输。 不支持端到端节点值流式处理,因为 LOB 列的值由 ODP.NET 缓冲,然后执行插入。 但是,LOB 数据类型支持BizTalk Server和适配器之间的节点值流式处理,因为 WCF-Custom 适配器使用 BodyWriter 创建消息。
表选择操作 支持 支持 WCF-Custom 适配器使用 XmlDictionaryWriter 来使用响应消息,因此支持 LOB 类型的端到端节点值流式处理。
表更新操作 支持 适配器和 Oracle 数据库之间不支持;但是,数据在BizTalk Server和适配器之间流式传输。 不支持端到端节点值流式处理,因为 LOB 列的值由 ODP.NET 缓冲,然后执行更新。 但是,LOB 数据类型支持BizTalk Server和适配器之间的节点值流式处理,因为 WCF-Custom 适配器使用 BodyWriter 创建消息。
表删除操作 支持 适配器和 Oracle 数据库之间不支持;但是,数据在BizTalk Server和适配器之间流式传输。 不支持端到端节点值流式处理,因为 LOB 列的值通过 ODP.NET 缓冲,然后执行删除。 但是,LOB 数据类型支持BizTalk Server和适配器之间的节点值流式处理,因为 WCF-Custom 适配器使用 BodyWriter 创建消息。
表读取LOB 操作 BizTalk Server不支持 ReadLOB 操作。 BizTalk Server不支持 ReadLOB 操作。 BizTalk Server不支持 ReadLOB 操作。 请改用 Select 操作或 SQLEXECUTE 操作。
表更新LOB 操作 支持 支持 WCF-Custom 适配器使用 BodyWriter 创建请求消息,因此支持 LOB 数据类型的端到端节点值流式处理。
SQLEXECUTE 操作 支持 支持 WCF-Custom 适配器使用 XmlDictionaryWriter 来使用响应消息,因此支持响应消息中 LOB 数据类型的端到端节点值流式处理。

请求消息不支持端到端节点值流式处理,因为适配器必须先缓冲所有操作数,然后才能对 Oracle 数据库调用操作。
存储过程和函数操作 支持 支持 WCF-Custom 适配器使用 XmlDictionaryWriter 来使用响应消息,因此支持响应消息中 LOB 数据类型的端到端节点值流式处理。 (这意味着响应 message 中的 OUT 和 IN OUT 过程和函数参数支持流式处理。)

请求消息不支持端到端节点值流式处理,因为适配器必须先缓冲所有操作数,然后才能对 Oracle 数据库调用操作。
POLLINGSTMT 操作 支持 支持 WCF-Custom 适配器使用 XmlDictionaryWriter 来使用 (入站) 请求消息,因此支持 LOB 数据类型的端到端节点值流式处理。

另请参阅

开发 Oracle 数据库应用程序