次の方法で共有


Oracle Database アダプターでのラージ オブジェクト データ型のストリーミング

Microsoft BizTalk Adapter for Oracle Database では、Oracle ラージ オブジェクト (LOB) データ型のストリーミングがサポートされています。 Oracle Database アダプター操作が呼び出されると、SOAP メッセージを交換することによって応答が返されます。 SOAP メッセージ本文は XML ノードで構成されます。

アダプターでサポートされているメッセージ ストリーミングには、次の 2 種類があります。

  • ノード ストリーミング。 ノード ストリーミングでは、各ノードは、Oracle データベースに送信される (またはクライアントに返される) 前に、アダプターによってバッファーされます。 つまり、LOB データ型の場合、値全体がバッファーに読み取られます。

  • ノード値ストリーミング。 ノード値ストリーミングでは、Oracle データベースとクライアントの間でノードの実際の値をチャンク単位でストリーミングできます。 ノード値ストリーミングでは、アダプター クライアントと Oracle データベース間の LOB データ型のエンド ツー エンド ストリーミングがサポートされます。

    どちらのストリーミング モードも、WCF のメッセージでのノード ストリーミングとノード値ストリーミングのサポートに依存しています。 このため、LOB 型のストリーミングは、アダプターとクライアント アプリケーションの両方によってメッセージがどのように作成および使用されるかに密接に関連付けられています。 この結果の 1 つは、ストリーミング 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。

    次の表は、メッセージの作成と使用のさまざまな組み合わせに対する WCF の動作を示しています。

で作成されたメッセージ で使用されるメッセージ WCF の動作
XmlBodyWriter XmlDictionaryWriter ノード値ストリーミング がサポートされています。 WCF では、2 つのライターをパイプしてストリーミングを有効にします。 XmlBodyWriterXmlDictionaryWriter の両方で、ノード値ストリーミングをサポートする必要があります。
XmlBodyWriter XmlReader ノード ストリーミング がサポートされています。 WCF は XmlReader を内部的にバッファー処理します。
XmlReader XmlDictionaryWriter ノード ストリーミング がサポートされています。 WCF は XmlReader を内部的にバッファー処理し、 XmlDictionaryWriter に呼び出し戻します。
XmlReader XmlReader ノード ストリーミング がサポートされています。 WCF は XmlReader を内部的にバッファー処理します。

Oracle クライアント ライブラリでのストリーミング サポート (ODP.NET)

ODP.NET では、次の方法でストリーミングがサポートされます。

  • ストリーミングは、Oracle LOB データ型でのみサポートされます。

  • 一部のテーブル (およびビュー) 操作では、LOB データ型がバッファーに格納されます。 そのため、ストリーミングはサポートされていません。

アダプターによる内部メッセージ処理

アダプターは、次の方法でストリーミングをサポートします。

  • アダプターは 、カスタム メッセージ クラス Microsoft.Adapters.AdapterUtilities.AdapterMessage を実装するために Message を拡張します。 アダプター クライアントに提供されるすべての WCF メッセージに対して AdapterMessage を作成します。これには、すべての送信操作の応答メッセージと POLLINGSTMT 操作の要求メッセージが含まれます。 これにより、アダプターは ReadValueChunk をサポートする XmlReader をアダプター クライアントに提供することで、ReadLOB 操作のノード値ストリーミングをサポートできます。

  • アダプターは、 XmlDictionaryWriter のカスタム実装を使用して、クライアントから受信したすべてのメッセージを使用します。

  • アダプターは、ReadLOB 応答メッセージを除き、 XmlBodyWriter のカスタム実装を使用してクライアントに送信するすべてのメッセージを作成します。 (これには、すべての送信操作の応答メッセージと 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 列に対してクライアントとアダプターの間のノード値ストリーミングが可能です。
Table ReadLOB 操作 サポートされています サポートされています ReadLOB 操作は、主に WCF サービス モデルで LOB データ列をストリーミングするように設計されています。 WCF チャネル モデルでは、クライアントが XmlReader を使用してメッセージを使用する場合 (応答メッセージで GetReaderAtBodyContents メソッドを呼び出すことによって)、エンド ツー エンドのノード値ストリーミングが発生します。 これは、アダプターが ReadLOB 応答メッセージの ReadValueChunk 呼び出しをサポートする XmlReader を返すからです。 ただし、WCF チャネル モデルの ReadLOB 操作は使用しないことをお勧めします。 代わりに、Select 操作または SQLEXECUTE 操作を使用できます。
Table UpdateLOB 操作 サポートされています サポートされています アダプターは 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 Database アダプターを参照します。WCF-Custom アダプターは常に、この表の完全な名前で参照されます)。

操作 ノード ストリーミング Node-Value ストリーミング 説明
テーブルの挿入操作 サポート対象* アダプターと Oracle データベースの間ではサポートされていません。ただし、データはBizTalk Serverとアダプターの間でストリーミングされます。 LOB 列の値は ODP.NET によってバッファーされ、挿入が実行されるため、エンド ツー エンドのノード値ストリーミングはサポートされていません。 ただし、BizTalk Serverとアダプターの間のノード値ストリーミングは、WCF-Custom アダプターが BodyWriter を使用してメッセージを作成するため、LOB データ型でサポートされています。
テーブルの選択操作 サポートされています サポートされています WCF-Custom アダプターは XmlDictionaryWriter を使用して応答メッセージを使用するため、LOB 型のエンド ツー エンドのノード値ストリーミングがサポートされます。
テーブルの更新操作 サポートされています アダプターと Oracle データベースの間ではサポートされていません。ただし、データはBizTalk Serverとアダプターの間でストリーミングされます。 LOB 列の値は ODP.NET によってバッファーに格納され、更新が実行されるため、エンド ツー エンドのノード値ストリーミングはサポートされていません。 ただし、BizTalk Serverとアダプターの間のノード値ストリーミングは、WCF-Custom アダプターが BodyWriter を使用してメッセージを作成するため、LOB データ型でサポートされています。
テーブルの削除操作 サポートされています アダプターと Oracle データベースの間ではサポートされていません。ただし、データはBizTalk Serverとアダプターの間でストリーミングされます。 LOB 列の値は ODP.NET によってバッファーに格納され、削除が実行されるため、エンド ツー エンドのノード値ストリーミングはサポートされていません。 ただし、BizTalk Serverとアダプターの間のノード値ストリーミングは、WCF-Custom アダプターが BodyWriter を使用してメッセージを作成するため、LOB データ型でサポートされています。
Table ReadLOB 操作 読み取りLOB 操作は、BizTalk Serverではサポートされていません。 読み取りLOB 操作は、BizTalk Serverではサポートされていません。 読み取りLOB 操作は、BizTalk Serverではサポートされていません。 代わりに Select 操作または SQLEXECUTE 操作を使用してください。
Table UpdateLOB 操作 サポートされています サポートされています WCF-Custom アダプターは BodyWriter を使用して要求メッセージを作成するため、LOB データ型のエンド ツー エンドのノード値ストリーミングがサポートされます。
SQLEXECUTE 操作 サポートされています サポートされています WCF-Custom アダプターは XmlDictionaryWriter を使用して応答メッセージを使用するため、応答メッセージ内の LOB データ型のエンド ツー エンドのノード値ストリーミングがサポートされます。

エンドツーエンドのノード値ストリーミングは、Oracle データベースで操作を呼び出す前にアダプターがすべてのオペランドをバッファーする必要があるため、要求メッセージではサポートされていません。
ストアド プロシージャと関数の操作 サポートされています サポートされています WCF-Custom アダプターは XmlDictionaryWriter を使用して応答メッセージを使用するため、応答メッセージ内の LOB データ型のエンド ツー エンドのノード値ストリーミングがサポートされます。 (これは、応答メッセージ内の OUT および IN OUT プロシージャおよび関数パラメーターに対してストリーミングがサポートされることを意味します)。

エンドツーエンドのノード値ストリーミングは、Oracle データベースで操作を呼び出す前にアダプターがすべてのオペランドをバッファーする必要があるため、要求メッセージではサポートされていません。
POLLINGSTMT 操作 サポートされています サポートされています WCF-Custom アダプターは XmlDictionaryWriter を使用して (受信) 要求メッセージを使用するため、LOB データ型のエンド ツー エンドのノード値ストリーミングがサポートされます。

参照

Oracle データベース アプリケーションの開発