共用方式為


在 Oracle Database 配接器中串流大型對象數據類型

Microsoft BizTalk Adapter for Oracle Database 支援 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(),或

    • 使用 XmlDictionaryWriter 來呼叫 Message.WriteBodyContents(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作業的要求訊息。 這可讓配接器支援 ReadLOB 作業的節點值串流,方法是提供支援 ReadValueChunkXmlReader 給配接器用戶端。

  • 配接器會使用 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 通道模型中,如果用戶端使用 XmlReader 來取用訊息(藉由叫用回應訊息上的 GetReaderAtBodyContents 方法),則會發生端對端節點值串流。 這是因為配接器會傳回一個 XmlReader,它支援對 ReadLOB 回應消息進行 ReadValueChunk 呼叫。 不過,建議您不要從 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 Database LOB 數據類型

WCF 服務模型中的串流支援

序列化與反序列化訊息的 XML 表示形式和受控代碼的物件表示形式,需要將整個訊息寫入與讀取至記憶體中。 基於這個理由,大部分作業都不支持節點串流和節點值串流。

唯一的例外狀況是 ReadLOB 作業。 這項作業特別是為了支援端對端串流,以便讀取 WCF 服務模型中的數據表和檢視 LOB 數據行。

BizTalk Server 中的串流支援

下表提供 BizTalk Server 中如何支援串流的詳細資訊。 (「配接器」的所有參考都會參考 Oracle 資料庫配接器;WCF-Custom 配接器一律會以此表格的完整名稱參照。

行動 節點串流 Node-Value 串流 說明
表格插入操作 支援* 配接器與 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 來取用 (inbound) 要求訊息,因此支援 LOB 數據類型的端對端節點值串流。

另請參閱

開發 Oracle 資料庫應用程式