在 Oracle 資料庫配接器中串流大型物件資料類型
Microsoft BizTalk Adapter for Oracle Database 支援串流處理 Oracle 大型物件 (LOB) 資料類型。 使用 Oracle 資料庫配接器作業時,會叫用回應,並藉由交換 SOAP 訊息來傳迴響應。 SOAP 訊息本文是由 XML 節點所組成。
配接器支援兩種訊息串流:
節點串流。 在節點串流中,每一個節點會在傳送至 Oracle 資料庫 (或傳回至用戶端) 之前,由配接器緩衝處理。 這表示,針對 LOB 資料類型,整個值會讀取到緩衝區中。
節點值串流。 在節點值串流中,節點的實際值可以用 Oracle 資料庫與用戶端之間的區塊串流處理。 節點值串流支援配接器用戶端與 Oracle 資料庫之間 LOB 資料類型的端對端串流。
這兩種串流模式都依賴對 WCF 中訊息的節點串流和節點值串流的支援。 因此,LOB 類型的串流會緊密系結至配接器和用戶端應用程式建立和取用訊息的方式。 其中一個結果是在所有程式設計模型中都支援串流 LOB 類型並不相同。
本主題中的各節提供:
WCF 如何支援訊息串流的基本背景資訊,以及如何由配接器實作。
當您在每個程式設計模型中使用配接器時,如何支援 LOB 資料類型的串流資訊。
串流基本概念
Oracle Database 配接器所實作的串流支援是下列專案的組合:
WCF 中的訊息串流支援。
Oracle 用戶端程式庫中的串流支援 (ODP.NET) 。
配接器在內部建立和取用訊息的方式。
WCF 中的訊息串流支援
WCF 如何支援在訊息上進行串流處理,取決於訊息的建立方式,以及訊息的取用方式。
WCF 訊息是使用System.ServiceModel.Channels.Message的靜態Create方法所建立。 這個方法有數個多載,可支援傳遞訊息本文的不同方式。 您可以使用下列方式傳遞訊息本文來建立 WCF 訊息:
System.Xml。XmlReader或
System.ServiceModel.Channels.BodyWriter。
可以使用 來取用 WCF 訊息
呼叫Message.GetReaderAtBodyContents () 或 的XmlReader
呼叫Message.WriteBodyContents (XmlDictionaryWriter) 的 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 通道模型中,如果用戶端在回應訊息上叫用GetReaderAtBodyContents方法,以使用XmlReader (來取用) 訊息,就會發生端對端節點值串流。 這是因為配接器會傳回支援ReadValueChunk 呼叫 ReadLOB回應訊息的XmlReader。 不過,建議您不要使用 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 標記法,以及該訊息的 Managed 程式碼物件表示,需要寫入整個訊息,並將整個訊息讀入記憶體中。 基於這個理由,大部分作業都不支援節點串流和節點值串流。
唯一的例外是 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 資料類型的端對端節點值串流。 |