Contexto
El
cliente requiere una lista de elementos del servicio de presentación. El número
de elementos de la lista no se conoce y puede ser muy importante en muchos
casos.
Problema
La
mayoría Plataforma Java 2, Enterprise Edition (J2EE) tiene una búsqueda y
exigencia de consulta para buscar y listar ciertos datos. En algunos casos,
como una operación de búsqueda y consulta podría producir resultados que pueden
ser muy grandes. No es práctico para devolver el conjunto de resultados
completo cuando las necesidades del cliente son para recorrer los resultados,
en lugar de los procesos del sistema completo. Normalmente, un cliente utiliza
los resultados de una consulta de sólo lectura fines, como mostrar la lista de
resultados. A menudo, el cliente ve sólo los primeros registros coincidentes, y
luego puede descartar los registros restantes e intentar una nueva consulta. La
actividad de búsqueda a menudo no se trata de una operación inmediata en los
objetos correspondientes. La práctica de obtener una lista de los valores
representados en los beans de entidad llamando a un ejbFind() método, que
devuelve una colección de objetos a distancia, y luego llamar a cada bean de
entidad para obtener el valor de la red es muy caro y se considera una mala
práctica.
Hay
consecuencias asociadas con el uso de Enterprise JavaBeans (EJB) métodos de
búsqueda que se traducen en grandes conjuntos de resultados. Cada
implementación de contenedor tiene una cierta cantidad de sobrecarga método de
búsqueda para la creación de una colección de referencias EJBObject.
Rendimiento de conducta método Finder es variable, dependiendo de la
implementación de contenedores de un proveedor. De acuerdo con la
especificación EJB, un contenedor puede invocar ejbActivate() métodos de
entidades encontradas por un método de búsqueda. Como mínimo, un método de
búsqueda devuelve las claves primarias de las entidades a juego, que el
contenedor devuelve al cliente como una colección de referencias EJBObject.
Este comportamiento se aplica para todas las implementaciones de contenedores.
Algunas implementaciones de contenedores pueden introducir método adicional
overhead buscador al asociar las instancias de beans de entidad de estos casos
EJBObject para dar al cliente el acceso a los beans de entidad. Sin embargo,
este es un mal uso de los recursos si el cliente no está interesado en el
acceso al bean o invocar sus métodos. Esta sobrecarga puede obstaculizar de
forma significativa el rendimiento de aplicaciones si la aplicación incluye
consultas que producen muchos resultados coincidentes.
Fuerzas:
- La aplicación cliente necesita un servicio de consulta eficaz para evitar tener que llamar al bean de entidad ejbFind() método y la invocación de cada objeto remoto devolvió.
- Se necesita un mecanismo de almacenamiento en caché de servidor de nivel para atender a clientes que no pueden recibir y procesar todo el conjunto de resultados.
- Una consulta que se ejecuta en varias ocasiones en los datos razonablemente estáticos puede ser optimizado para proporcionar resultados más rápidos. Esto depende de la aplicación y en la implementación de este patrón.
- Métodos de búsqueda EJB no son adecuados para la navegación tablas enteras en la base de datos o para la búsqueda de grandes conjuntos de resultados de una mesa.
- Los métodos de búsqueda pueden tener una sobrecarga considerable cuando se utiliza para encontrar un gran número de objetos de resultado. El recipiente puede crear un gran número de objetos de infraestructura para facilitar los buscadores.
- Métodos de búsqueda EJB no son adecuados para el almacenamiento en caché los resultados. El cliente puede no ser capaz de manejar todo el conjunto de resultados en una sola llamada. Si es así, el cliente puede necesitar el almacenamiento en caché del lado del servidor y las funciones de navegación para atravesar el conjunto de resultados.
- Métodos de búsqueda EJB han determinado construcciones de consulta y ofrecer una flexibilidad mínima. La especificación EJB 2.0 permite un lenguaje de consulta, EJB QL, para gestionadas por contenedor beans de entidad. EJB QL hace que sea más fácil escribir buscadores portátil y ofrece una mayor flexibilidad para realizar consultas.
- Cliente quiere desplazarse hacia adelante y hacia atrás dentro de un conjunto de resultados.
Solución
Utilice un Value List Handler para controlar la
búsqueda, almacenar en caché los resultados y presentar los resultados al
cliente en una lista de productos cuyo tamaño y recorrido cumple con los
requisitos del cliente.
Estructura
El
diagrama de clases en la Figura 8.29 ilustra el patrón Value List Handler.
Figura
8.29 Lista de valores de controlador Diagrama de Clases
Participantes
y Colaboraciones
El
diagrama de secuencia de la Figura 8.30 muestra las interacciones de los Value
List Handler.
Figura
8.30 Lista de valores de controlador de secuencia Diagrama
ValueListIterator
Esta
interfaz puede proporcionar instalación de iteración con los siguientes métodos
de ejemplo:
- getSize() obtiene el tamaño del conjunto de resultados.
- getCurrentElement() obtiene la corriente Transfer Object de la lista.
- getPreviousElements(int howMany) obtiene una colección de Transfer Objects que se encuentran en la lista antes de que el elemento actual.
- getNextElements(int howMany) obtiene una colección de objetos de transferencia que están en la lista después de que el elemento actual.
- resetIndex() restablece el índice para el inicio de la lista.
Dependiendo
de la necesidad, otros métodos de conveniencia se pueden incluir para ser parte
de la interfaz de ValueListIterator.
ValueListHandler
Este es
un objeto manejador de listas que implementa la interfaz ValueListIterator. El
ValueListHandler ejecuta la consulta requerida cuando lo solicite el cliente.
El ValueListHandler obtiene los resultados de la consulta, que se gestiona en
una colección privada representada por el objeto ValueList. El ValueListHandler
crea y manipula la colección ValueList. Cuando el cliente solicita los
resultados, el ValueListHandler obtiene los objetos de transferencia de la
ValueList caché, crea una nueva colección de Transfer Objects, serializa la
colección, y lo envía de vuelta al cliente. El ValueListHandler también rastrea
el índice actual y el tamaño de la lista.
DataAccessObject
El
ValueListHandler puede hacer uso de un DataAccessObject mantener separadas la
ejecución de la conexión a la base de datos. El DataAccessObject proporciona
una API simple para acceder a la base de datos (o cualquier otro almacén
persistente), ejecutar la consulta, y recuperar los resultados.
ValueList
El
ValueList es una colección (una lista) que contiene los resultados de la
consulta. Los resultados se almacenan como objetos de transferencia. Si la
consulta no devuelve ninguna coincidencia, entonces esta lista está vacía. El
bean de sesión ValueListHandler almacena ValueList para evitar repetirse,
ejecución innecesaria de la consulta.
TransferObject
El
TransferObject representa una vista de objetos del registro individual de los
resultados de la consulta. Es un objeto serializable inmutable que proporciona
un marcador de posición para los atributos de datos de cada registro.
Consecuencias
·
Proporciona una alternativa a EJB Finders para
grandes consultas
Normalmente, un método de búsqueda EJB es un uso intensivo de recursos y una manera costosa de obtener una lista de elementos, ya que implica una serie de referencias EJBObject. El Value List Handler implementa un bean de sesión que utiliza un DAO para realizar la consulta y la creación de una colección de Transfer Objects que coinciden con los criterios de la consulta. Debido Transfer Objects tienen relativamente bajos costos en comparación con las referencias EJBObject y su infraestructura asociada, este patrón proporciona beneficios cuando los clientes de aplicación requieren consultas que resulten en grandes conjuntos de resultados.
Normalmente, un método de búsqueda EJB es un uso intensivo de recursos y una manera costosa de obtener una lista de elementos, ya que implica una serie de referencias EJBObject. El Value List Handler implementa un bean de sesión que utiliza un DAO para realizar la consulta y la creación de una colección de Transfer Objects que coinciden con los criterios de la consulta. Debido Transfer Objects tienen relativamente bajos costos en comparación con las referencias EJBObject y su infraestructura asociada, este patrón proporciona beneficios cuando los clientes de aplicación requieren consultas que resulten en grandes conjuntos de resultados.
·
Cachés de resultados de la consulta en el lado del
servidor
El conjunto de resultados obtenido a partir de una ejecución de la consulta debe ser almacenado en caché cuando un cliente debe mostrar los resultados en pequeños subgrupos en lugar de en una lista grande. Sin embargo, no todos los clientes basados en navegador puede realizar dicha caché. Cuando no pueden, el servidor debe proporcionar esta funcionalidad. El patrón Value List Handler proporciona una instalación de almacenamiento en caché en la lista de beans de sesión Manejador de valor para mantener el conjunto de resultados que obtiene de una ejecución de la consulta. El conjunto de resultados es una colección de Transfer Objects que se pueden serializar si es necesario.
El conjunto de resultados obtenido a partir de una ejecución de la consulta debe ser almacenado en caché cuando un cliente debe mostrar los resultados en pequeños subgrupos en lugar de en una lista grande. Sin embargo, no todos los clientes basados en navegador puede realizar dicha caché. Cuando no pueden, el servidor debe proporcionar esta funcionalidad. El patrón Value List Handler proporciona una instalación de almacenamiento en caché en la lista de beans de sesión Manejador de valor para mantener el conjunto de resultados que obtiene de una ejecución de la consulta. El conjunto de resultados es una colección de Transfer Objects que se pueden serializar si es necesario.
Cuando el cliente solicita una colección, o
un subconjunto de una colección, el bean manejador devuelve los resultados
solicitados como una colección serializada de Transfer Objects. El
cliente recibe la colección y ahora tiene una copia local de la información
solicitada, que el cliente puede visualizar o procesar. Cuando el cliente necesita un subgrupo adicional de los
resultados, se solicita el controlador para volver otra colección serializada
que contiene los resultados necesarios. El
cliente puede procesar los resultados de la consulta en más pequeñas y
manejables. El bean manejador también
proporciona al cliente facilidades de navegación (anterior y posterior), de
modo que los resultados pueden ser recorridos hacia adelante y hacia atrás si
es necesario.
·
Proporciona una mejor flexibilidad Consulta
Adición de una nueva consulta puede requerir la creación de un nuevo método de búsqueda o modificar un método existente, especialmente al usar frijol gestionados beans de entidad. (Con gestionadas por bean beans de entidad, el desarrollador implementa los métodos de búsqueda de la implementación del bean.) Con una gestionada por contenedor bean de entidad, el programa de implementación especifica la entidad métodos de búsqueda de frijol en el descriptor de despliegue del bean. Los cambios en una consulta para un bean controlado por contenedor requieren cambios en la especificación del método de búsqueda en el descriptor de despliegue. Por lo tanto, métodos de búsqueda son poco adecuados para manejar los requerimientos de consulta que cambian dinámicamente. Puede implementar un Value List Handler para ser más flexible que los métodos de búsqueda EJB, proporcionando facilidades de consulta ad hoc, la construcción de argumentos de consulta en tiempo de ejecución utilizando métodos de plantilla, y así sucesivamente. En otras palabras, un desarrollador Value List Handler puede implementar algoritmos de búsqueda y almacenamiento en caché inteligente sin estar limitado por los métodos de búsqueda.
Adición de una nueva consulta puede requerir la creación de un nuevo método de búsqueda o modificar un método existente, especialmente al usar frijol gestionados beans de entidad. (Con gestionadas por bean beans de entidad, el desarrollador implementa los métodos de búsqueda de la implementación del bean.) Con una gestionada por contenedor bean de entidad, el programa de implementación especifica la entidad métodos de búsqueda de frijol en el descriptor de despliegue del bean. Los cambios en una consulta para un bean controlado por contenedor requieren cambios en la especificación del método de búsqueda en el descriptor de despliegue. Por lo tanto, métodos de búsqueda son poco adecuados para manejar los requerimientos de consulta que cambian dinámicamente. Puede implementar un Value List Handler para ser más flexible que los métodos de búsqueda EJB, proporcionando facilidades de consulta ad hoc, la construcción de argumentos de consulta en tiempo de ejecución utilizando métodos de plantilla, y así sucesivamente. En otras palabras, un desarrollador Value List Handler puede implementar algoritmos de búsqueda y almacenamiento en caché inteligente sin estar limitado por los métodos de búsqueda.
·
Mejora el rendimiento de la red
Rendimiento de la red puede mejorar, porque los datos sólo solicitados, en lugar de todos los datos, se envían (serializados) al cliente sobre una base como-necesaria. Si el cliente muestra los primeros resultados y luego abandona la consulta, el ancho de banda de red no se desperdicia, ya que los datos se almacena en caché en el lado del servidor y nunca se envía al cliente. Sin embargo, si el cliente procesa el conjunto de resultados, hace varias llamadas remotas al servidor para el conjunto de resultados. Cuando el cliente sabe de antemano que tiene el conjunto de resultados, el bean manejador puede proporcionar un método que envía el cliente de todo el conjunto de resultados de una llamada a un método, y la función de caché del patrón no se utiliza.
Rendimiento de la red puede mejorar, porque los datos sólo solicitados, en lugar de todos los datos, se envían (serializados) al cliente sobre una base como-necesaria. Si el cliente muestra los primeros resultados y luego abandona la consulta, el ancho de banda de red no se desperdicia, ya que los datos se almacena en caché en el lado del servidor y nunca se envía al cliente. Sin embargo, si el cliente procesa el conjunto de resultados, hace varias llamadas remotas al servidor para el conjunto de resultados. Cuando el cliente sabe de antemano que tiene el conjunto de resultados, el bean manejador puede proporcionar un método que envía el cliente de todo el conjunto de resultados de una llamada a un método, y la función de caché del patrón no se utiliza.
·
Permite el aplazamiento de transacciones de beans de
entidad
Almacenamiento en caché los resultados en el lado del servidor y minimizando el gasto buscador puede mejorar la gestión de transacciones. Cuando el cliente está listo para procesar más de un bean de entidad, se accede al bean dentro de un contexto de transacción definida por el caso de uso. Por ejemplo, una consulta para mostrar una lista de los libros utiliza un Value List Handler para obtener la lista. Cuando el usuario quiere ver un libro en detalle, se trata del libro bean de entidad en una transacción.
Almacenamiento en caché los resultados en el lado del servidor y minimizando el gasto buscador puede mejorar la gestión de transacciones. Cuando el cliente está listo para procesar más de un bean de entidad, se accede al bean dentro de un contexto de transacción definida por el caso de uso. Por ejemplo, una consulta para mostrar una lista de los libros utiliza un Value List Handler para obtener la lista. Cuando el usuario quiere ver un libro en detalle, se trata del libro bean de entidad en una transacción.
(© 2001-2002 Sun Microsystems, Inc. Todos los
derechos reservados.)
No hay comentarios:
Publicar un comentario