Streaming de tipos de datos de objetos grandes en el adaptador de base de datos de Oracle
El adaptador de Microsoft BizTalk para Oracle Database admite streaming para tipos de datos de objetos grandes (LOB) de Oracle. Con las operaciones del adaptador de base de datos de Oracle se invocan y las respuestas se devuelven intercambiando mensajes SOAP. Un cuerpo del mensaje SOAP se compone de nodos XML.
El adaptador admite dos tipos de streaming de mensajes:
Streaming de nodo. En el streaming de nodos, el adaptador almacena en búfer cada nodo antes de enviarlo a la base de datos de Oracle (o se devuelve al cliente). Esto significa que, para un tipo de datos LOB, todo el valor se lee en un búfer.
Streaming de valor de nodo. En el streaming de nodo-valor, el valor real del nodo se puede transmitir en fragmentos entre la base de datos de Oracle y el cliente. El streaming de valor de nodo admite el streaming de un extremo a otro de los tipos de datos LOB entre el cliente del adaptador y la base de datos de Oracle.
Ambos modos de streaming dependen de la compatibilidad con el streaming de nodos y el streaming de valor de nodo en los mensajes de WCF. Por este motivo, el streaming de los tipos LOB está estrechamente relacionado con cómo se crean y consumen los mensajes tanto por el adaptador como por una aplicación cliente. Un resultado de esto es que la compatibilidad con los tipos de LOB de streaming no es la misma en todos los modelos de programación.
Las secciones de este tema proporcionan:
Información general fundamental sobre cómo se admite el streaming de mensajes en WCF y cómo lo implementa el adaptador.
Información sobre cómo se admite el streaming para los tipos de datos LOB cuando se usa el adaptador en cada modelo de programación.
Aspectos básicos de streaming
La compatibilidad con el streaming implementado por el adaptador de Base de datos de Oracle es una combinación de:
Compatibilidad con streaming de mensajes en WCF.
Compatibilidad con streaming en la biblioteca cliente de Oracle (ODP.NET).
El adaptador crea y consume internamente los mensajes.
Compatibilidad con streaming de mensajes en WCF
La forma en que WCF admite el streaming en un mensaje depende tanto de cómo se crea el mensaje como de cómo se consume el mensaje.
Se crea un mensaje WCF mediante el método Create estático de System.ServiceModel.Channels.Message. Este método tiene varias sobrecargas que admiten diferentes formas de pasar el cuerpo del mensaje. Se puede crear un mensaje WCF pasando el cuerpo del mensaje mediante:
Un System.Xml. XmlReader, o
System.ServiceModel.Channels.BodyWriter.
Se puede consumir un mensaje WCF mediante
XmlReader llamando a Message.GetReaderAtBodyContents() o
XmlDictionaryWriter llamando a Message.WriteBodyContents(XmlDictionaryWriter).
En la tabla siguiente se muestra cómo se comporta WCF para diferentes combinaciones de creación y consumo de mensajes.
Mensaje creado con | Mensaje consumido con | Comportamiento de WCF |
---|---|---|
XmlBodyWriter | XmlDictionaryWriter | Se admite la transmisión por secuencias de valor de nodo . WCF canaliza los dos escritores juntos para habilitar el streaming. XmlBodyWriter y XmlDictionaryWriter deben admitir el streaming de valores de nodo para que se produzca. |
XmlBodyWriter | XmlReader | Se admite el streaming de nodo . WCF almacena internamente en búfer el objeto XmlReader. |
XmlReader | XmlDictionaryWriter | Se admite el streaming de nodo . WCF almacena internamente en búfer el Objeto XmlReader y vuelve a llamar a XmlDictionaryWriter. |
XmlReader | XmlReader | Se admite el streaming de nodo . WCF almacena internamente en búfer el objeto XmlReader. |
Compatibilidad con streaming en la biblioteca cliente de Oracle (ODP.NET)
ODP.NET admite el streaming de la siguiente manera:
El streaming solo se admite en tipos de datos loB de Oracle.
Para algunas operaciones de tabla (y vista), los tipos de datos LOB se almacenan en búfer. Por lo tanto, no se admite ningún streaming.
Control interno de mensajes por el adaptador
El adaptador admite el streaming de la siguiente manera:
El adaptador extiende Message para implementar una clase de mensaje personalizada, Microsoft.Adapters.AdapterUtilities.AdapterMessage. Crea un AdapterMessage para todos los mensajes WCF que proporciona al cliente del adaptador; esto incluye los mensajes de respuesta para todas las operaciones salientes y el mensaje de solicitud para la operación POLLINGSTMT. Esto permite que el adaptador admita el streaming de valores de nodo para la operación ReadLOB proporcionando un XmlReader que admita ReadValueChunk a los clientes adaptadores.
El adaptador consume todos los mensajes recibidos del cliente mediante una implementación personalizada de XmlDictionaryWriter.
El adaptador crea todos los mensajes que envía al cliente mediante una implementación personalizada de XmlBodyWriter, excepto el mensaje de respuesta ReadLOB. (Esto incluye mensajes de respuesta para todas las operaciones salientes y el mensaje de solicitud para la operación POLLINGSTMT).
Compatibilidad con streaming en el modelo de canal WCF
En la tabla siguiente se proporciona información detallada sobre cómo se admite el streaming en el modelo de canal WCF.
Operación | Streaming de nodos | streaming de Node-Value | Descripción |
---|---|---|---|
Operación de inserción de tabla | Admitido* | No se admite entre el adaptador y la base de datos de Oracle. Se admite entre el cliente y el adaptador.* | No se admite el streaming de valor de nodo de un extremo a otro porque los valores de las columnas LOB se almacenan en búfer ODP.NET y, a continuación, se realiza la inserción. Sin embargo, el streaming de valor de nodo entre el cliente y el adaptador es posible para las columnas LOB, si el cliente crea el mensaje con un BodyWriter. |
Operación De selección de tabla | Compatible | Compatible | El adaptador usa bodyWriter para crear el mensaje de respuesta. Si el cliente consume el mensaje mediante xmlDictionaryWriter, se produce un streaming de valor de nodo para las columnas LOB. |
Operación de actualización de tabla | Compatible | No se admite entre el adaptador y la base de datos de Oracle. Se admite entre el cliente y el adaptador. | No se admite el streaming de valor de nodo de un extremo a otro porque los valores de las columnas loB se almacenan en búfer ODP.NET y, a continuación, se realiza la actualización. Sin embargo, el streaming de valor de nodo entre el cliente y el adaptador es posible para las columnas loB si el cliente crea el mensaje con bodyWriter. |
Operación de eliminación de tabla | Compatible | No se admite entre el adaptador y la base de datos de Oracle. Se admite entre el cliente y el adaptador. | No se admite el streaming de valor de nodo de un extremo a otro porque los valores de las columnas loB se almacenan en búfer ODP.NET y, a continuación, se realiza la eliminación. Sin embargo, el streaming de valor de nodo entre el cliente y el adaptador es posible para las columnas loB si el cliente crea el mensaje con bodyWriter. |
Operación ReadLOB de tabla | Compatible | Compatible | La operación ReadLOB está diseñada principalmente para transmitir columnas de datos LOB en el modelo de servicio WCF. En el modelo de canal WCF, si el cliente consume el mensaje mediante xmlReader (invocando el método GetReaderAtBodyContents en el mensaje de respuesta), se produce un streaming de valor de nodo de un extremo a otro. Esto se debe a que el adaptador devuelve un xmlReader que admite llamadas ReadValueChunk para el mensaje de respuesta ReadLOB. Sin embargo, se recomienda no usar la operación ReadLOB del modelo de canal WCF. Puede usar una operación Select o una operación SQLEXECUTE en su lugar. |
Operación UpdateLOB de tabla | Compatible | Compatible | El adaptador usa xmlDictionaryWriter para consumir el mensaje de solicitud. Si el cliente usa bodyWriter para crear el mensaje de solicitud, se produce un streaming de valor de nodo de un extremo a otro para los datos LOB. |
Operación SQLEXECUTE | Compatible | Compatible | El adaptador usa bodyWriter para crear el mensaje de respuesta. Si el cliente usa xmlDictionaryWriter para consumir el mensaje de respuesta, se produce un streaming de valor de nodo de un extremo a otro para los datos loB. No se admite el streaming de valor de nodo de un extremo a otro para el mensaje de solicitud porque el adaptador debe almacenar en búfer todos los operandos antes de poder invocar la operación en la base de datos de Oracle. |
Procedimiento almacenado y operación de función | Compatible | Compatible | El adaptador usa bodyWriter para crear el mensaje de respuesta. Si el cliente usa xmlDictionaryWriter para consumir el mensaje de respuesta, se produce un streaming de valor de nodo de un extremo a otro para los datos loB. (Esto significa que el streaming se admite para los parámetros de procedimiento OUT e IN OUT y función en el mensaje de respuesta). No se admite el streaming de valor de nodo de un extremo a otro para el mensaje de solicitud porque el adaptador debe almacenar en búfer todos los operandos antes de poder invocar la operación en la base de datos de Oracle. |
Operación POLLINGSTMT | Compatible | Compatible | El adaptador usa bodyWriter para crear el mensaje de solicitud POLLINGSTMT. Si el cliente consume el mensaje mediante xmlDictionaryWriter, se produce el streaming de valor de nodo para las columnas LOB. |
Para obtener información sobre cómo implementar el streaming de datos LOB en el código al usar el modelo de canal WCF, vea Streaming de tipos de datos loB de base de datos de Oracle mediante el modelo de canal WCF.
Compatibilidad con streaming en el modelo de servicio WCF
La serialización y deserialización entre la representación XML de un mensaje y la representación de objeto de código administrado de ese mensaje requiere escribir y leer todo el mensaje en la memoria. Por este motivo, no se admite el streaming de nodos ni el streaming de valor de nodo para la mayoría de las operaciones.
La única excepción a esto es la operación ReadLOB. Esta operación se implementa específicamente para admitir el streaming de un extremo a otro para leer columnas loB de tabla y vista en el modelo de servicio WCF.
Compatibilidad con streaming en BizTalk Server
En la tabla siguiente se proporciona información detallada sobre cómo se admite el streaming en BizTalk Server. (Todas las referencias al "adaptador" hacen referencia al adaptador de Oracle Database; el adaptador de WCF-Custom siempre se conoce por su nombre completo en esta tabla).
Operación | Streaming de nodos | streaming de Node-Value | Descripción |
---|---|---|---|
Operación de inserción de tabla | Admitido* | No se admite entre el adaptador y la base de datos de Oracle; sin embargo, los datos se transmiten entre BizTalk Server y el adaptador. | No se admite el streaming de valor de nodo de un extremo a otro porque los valores de las columnas loB se almacenan en búfer por ODP.NET y, a continuación, se realiza la inserción. Sin embargo, el streaming de nodo-valor entre BizTalk Server y el adaptador se admite para los tipos de datos LOB porque el adaptador de WCF-Custom crea el mensaje con bodyWriter. |
Operación De selección de tabla | Compatible | Compatible | El adaptador de WCF-Custom usa xmlDictionaryWriter para consumir el mensaje de respuesta, por lo que se admite el streaming de valor de nodo de un extremo a otro para los tipos LOB. |
Operación de actualización de tabla | Compatible | No se admite entre el adaptador y la base de datos de Oracle; sin embargo, los datos se transmiten entre BizTalk Server y el adaptador. | No se admite el streaming de valor de nodo de un extremo a otro porque los valores de las columnas loB se almacenan en búfer por ODP.NET y, a continuación, se realiza la actualización. Sin embargo, el streaming de nodo-valor entre BizTalk Server y el adaptador se admite para los tipos de datos LOB porque el adaptador de WCF-Custom crea el mensaje con bodyWriter. |
Operación de eliminación de tabla | Compatible | No se admite entre el adaptador y la base de datos de Oracle; sin embargo, los datos se transmiten entre BizTalk Server y el adaptador. | No se admite el streaming de valor de nodo de un extremo a otro porque los valores de las columnas loB se almacenan en búfer por ODP.NET y, a continuación, se realiza la eliminación. Sin embargo, el streaming de nodo-valor entre BizTalk Server y el adaptador se admite para los tipos de datos LOB porque el adaptador de WCF-Custom crea el mensaje con bodyWriter. |
Operación ReadLOB de tabla | La operación ReadLOB no se admite para BizTalk Server. | La operación ReadLOB no se admite para BizTalk Server. | La operación ReadLOB no se admite para BizTalk Server. Use la operación Select o una operación SQLEXECUTE en su lugar. |
Operación UpdateLOB de tabla | Compatible | Compatible | El adaptador de WCF-Custom usa bodyWriter para crear el mensaje de solicitud, por lo que se admite el streaming de valores de nodo de un extremo a otro para los tipos de datos LOB. |
Operación SQLEXECUTE | Compatible | Compatible | El adaptador de WCF-Custom usa xmlDictionaryWriter para consumir el mensaje de respuesta, por lo que se admite el streaming de valor de nodo de un extremo a otro para los tipos de datos LOB en el mensaje de respuesta. No se admite el streaming de valor de nodo de un extremo a otro para el mensaje de solicitud porque el adaptador debe almacenar en búfer todos los operandos antes de poder invocar la operación en la base de datos de Oracle. |
Procedimiento almacenado y operación de función | Compatible | Compatible | El adaptador de WCF-Custom usa xmlDictionaryWriter para consumir el mensaje de respuesta, por lo que se admite el streaming de valor de nodo de un extremo a otro para los tipos de datos LOB en el mensaje de respuesta. (Esto significa que el streaming se admite para los parámetros de procedimiento OUT e IN OUT y función en el mensaje de respuesta). No se admite el streaming de valor de nodo de un extremo a otro para el mensaje de solicitud porque el adaptador debe almacenar en búfer todos los operandos antes de poder invocar la operación en la base de datos de Oracle. |
Operación POLLINGSTMT | Compatible | Compatible | El adaptador de WCF-Custom usa xmlDictionaryWriter para consumir el mensaje de solicitud (entrante), por lo que se admite el streaming de valor de nodo de un extremo a otro para los tipos de datos LOB. |