适用于 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 消息
XmlReader可以通过调用Message.GetReaderAtBodyContents()或
通过调用 Message.WriteBodyContents(XmlDictionaryWriter)来调用 XmlDictionaryWriter。
下表显示了 WCF 在不同的消息创建和使用组合情境下的运作方式。
使用 |
消息已被消费 | WCF 行为 |
---|---|---|
XmlBodyWriter | XmlDictionaryWriter | 支持节点值流式处理。 WCF 通过管道连接两个写入器以启用流式处理。 XmlBodyWriter 和 XmlDictionaryWriter 都必须支持节点值流式处理才能发生。 |
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 操作的请求消息。 通过向适配器客户端提供支持ReadValueChunk的XmlReader,适配器可以支持对ReadLOB操作进行节点值流式处理。
适配器通过自定义实现的XmlDictionaryWriter处理从客户端接收的所有消息。
适配器通过使用 XmlBodyWriter 的自定义实现(ReadLOB 响应消息除外)创建它发送到客户端的所有消息。 (这包括所有出站操作的响应消息和 POLLINGSTMT 操作的请求消息。)
WCF 通道模型中的流式支持
下表提供有关 WCF 通道模型中如何支持流式处理的详细信息。
操作 | 节点流式处理 | Node-Value 流式处理 | DESCRIPTION |
---|---|---|---|
表插入操作 | 支持* | 适配器和 Oracle 数据库之间不受支持。 在客户端和适配器之间受支持。* | 不支持端到端节点值流式处理,因为 LOB 列的值由 ODP.NET 缓冲,然后执行插入。 但是,如果客户端使用 BodyWriter 创建消息,则客户端和适配器之间的节点值流式处理可用于 LOB 列。 |
表选择操作 | 已支持 | 已支持 | 适配器使用 BodyWriter 创建响应消息。 如果客户端使用 XmlDictionaryWriter 消费消息,则会对 LOB 列的节点值进行流式处理。 |
表更新操作 | 已支持 | 适配器和 Oracle 数据库之间不受支持。 在客户端和适配器之间支持。 | 不支持端到端节点值流式处理,因为 LOB 列的值由 ODP.NET 缓冲,然后执行更新。 但是,如果客户端使用 BodyWriter 创建消息,则客户端和适配器之间的节点值流式处理可用于 LOB 列。 |
表删除操作 | 已支持 | 适配器和 Oracle 数据库之间不受支持。 客户端和适配器之间的支持。 | 不支持端到端节点值流式处理,因为 LOB 列的值由 ODP.NET 缓冲,然后执行删除。 但是,如果客户端使用 BodyWriter 创建消息,则客户端和适配器之间的节点值流式处理可用于 LOB 列。 |
表 ReadLOB 操作 | 已支持 | 已支持 | ReadLOB 操作主要设计用于在 WCF 服务模型中流式传输 LOB 数据列。 在 WCF 通道模型中,如果客户端使用 XmlReader (通过在响应消息上调用 GetReaderAtBodyContents 方法),则会发生端到端节点值流式处理。 这是因为适配器返回一个支持 ReadValueChunk 调用的 XmlReader,用于处理 ReadLOB 响应消息。 但是,建议不要在 WCF 通道模型中使用 ReadLOB 操作。 可以使用 SELECT 操作或 SQLEXECUTE 操作。 |
表更新LOB操作 | 已支持 | 已支持 | 适配器使用 XmlDictionaryWriter 来处理请求消息。 如果客户端使用 BodyWriter 创建请求消息,则会发生 LOB 数据的端到端节点值流式处理。 |
SQLEXECUTE操作 | 已支持 | 已支持 | 适配器使用 BodyWriter 创建响应消息。 如果客户端使用 XmlDictionaryWriter 来使用响应消息,则会发生 LOB 数据的端到端节点值流式处理。 请求消息不支持端到端节点值流,因为适配器必须缓冲所有操作数,然后才能在 Oracle 数据库上调用操作。 |
存储过程和函数操作 | 已支持 | 已支持 | 适配器使用 BodyWriter 创建响应消息。 如果客户端使用 XmlDictionaryWriter 来使用响应消息,则会发生 LOB 数据的端到端节点值流式处理。 (这意味着,响应消息中的 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 流式处理 | DESCRIPTION |
---|---|---|---|
表插入操作 | 支持* | 适配器和 Oracle 数据库之间不受支持;但是,数据在 BizTalk Server 和适配器之间流式传输。 | 不支持端到端节点值流式处理,因为 LOB 列的值由 ODP.NET 缓冲,然后执行插入。 但是,BizTalk Server 与适配器之间的节点值流式处理支持 LOB 数据类型,因为 WCF-Custom 适配器使用 BodyWriter 创建消息。 |
表选择操作 | 已支持 | 已支持 | WCF-Custom 适配器使用 XmlDictionaryWriter 来使用响应消息,因此支持 LOB 类型的端到端节点值流式处理。 |
表更新操作 | 已支持 | 适配器和 Oracle 数据库之间不受支持;但是,数据在 BizTalk Server 和适配器之间流式传输。 | 不支持端到端节点值流式处理,因为 LOB 列的值由 ODP.NET 缓冲,然后执行更新。 但是,BizTalk Server 与适配器之间的节点值流式处理支持 LOB 数据类型,因为 WCF-Custom 适配器使用 BodyWriter 创建消息。 |
表删除操作 | 已支持 | 适配器和 Oracle 数据库之间不受支持;但是,数据在 BizTalk Server 和适配器之间流式传输。 | 不支持端到端节点值流式处理,因为 LOB 列的值由 ODP.NET 缓冲,然后执行删除。 但是,BizTalk Server 与适配器之间的节点值流式处理支持 LOB 数据类型,因为 WCF-Custom 适配器使用 BodyWriter 创建消息。 |
表 ReadLOB 操作 | 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 数据类型的端到端节点值流式处理。 (这意味着,响应消息中的 OUT 和 IN OUT 过程和函数参数支持流式处理。 请求消息不支持端到端节点值流处理,因为适配器必须缓冲所有操作数,然后才能在 Oracle 数据库上执行操作。 |
POLLINGSTMT操作 | 已支持 | 已支持 | WCF-Custom 适配器使用 XmlDictionaryWriter 来处理(入站)请求消息,因此支持 LOB 数据类型的端到端节点值流式处理。 |