Pregunta

Actualización II: OK, he conseguido reducirla un poco.

Tengo una página con una tabla de datos con la clasificación y filtrado funcionalidades, tanto que tienen lugar en la base de datos. En otras palabras, yo no uso la funcionalidad embebida de los ricos: tabla de datos que uso, sino más bien dejar que el PP haga el trabajo

.

Yo trabajo con solicitud de ámbito frijoles. Los únicos beans de sesión con ámbito contienen la clasificación y filtrado de mi interfaz.

Filtrado de cada columna se une a los determinados campos de frijol sesión. Como tal, es en realidad Valores actualiza durante la fase de actualización del modelo.

Clasificación requiere cierta lógica de mi parte, así que invocar un cierto método para establecer los valores correctos para el bean de sesión. Esto se realiza durante la fase de aplicación Invoke.

Por lo tanto, cualquier cambio que están en su lugar durante la fase de respuesta Render, donde la página hace realidad.

El problema es que la tabla de datos de JSF y datascroller en mi página de llamada de la backingBean.getDataModel() que recuperan los datos de la base de datos y la dataModel.getRowCount() (que he implementado para invocar un método que se ejecuta una consulta independiente) también durante los aplicar Solicitar Valores fase. Estas dos consultas llevan también a cabo durante la fase de respuesta Render, que es la única fase en la que los cambios están en su lugar, y la consulta se ejecutará normalmente.

Esto significa que para mostrar una página después de realizar el filtrado o la clasificación, el doble número de consultas que tienen lugar.

Quiero realizar la clasificación y filtrado solamente realizar las consultas necesarias y no más.

¿Alguna sugerencia?

¿Fue útil?

Solución

La llamada captador durante la fase de aplicar los valores de petición es obligatorio porque JSF necesita saber qué valores de entrada se mostraron inicialmente de modo que con el tiempo puede hacer ninguna validación y / o llame a cualquier valuechangelisteners en la siguiente fase en su caso. También es obligatorio para averiguar qué botón / enlace se presiona / se hace clic en cualquiera de las filas para que sepa qué acción frijol para llamar a la acción en la fase de invocación.

Pero si usted no tiene ningún campo de entrada que han de ser validados / valuechange-controlados ni ningún botón / enlaces en cualquiera de las filas, entonces me puedo imaginar que la consulta durante la fase de aplicación los valores de petición está en el ojo por completo superflua.

Por desgracia, no se puede desactivar por completo. Técnicamente, el único recurso de que está poniendo el bean de datos en el ámbito de la sesión y hacer la consulta SQL caro (y refrescar del modelo de datos) sólo en el constructor del grano y en el método de la acción de frijol, de modo que sólo se les invoca durante de frijol construcción (por primera vista) y durante el método de acción del frijol (durante un nuevo tipo / filtro / lo que sea petición). sin embargo, la desventaja es que cualquier cambio en los modelo de datos se refleja en todas las ventanas / pestañas el usuario final tiene abierta en la misma sesión, que puede provocar "wtf?" experiencias para el usuario final.

Ahora, Tomahawk fue la primera que tiene una solución agradable para esto en el sabor del atributo preserveDataModel para la <t:dataTable>, que básicamente pone el modelo de datos en el árbol de componentes-petición específica (que a su vez ya se ha almacenado en el ámbito de sesión o en un campo de entrada oculto en el lado del cliente, dependiendo de cómo haya configurado la ubicación del almacén del estado de vista de caras-config). RichFaces no tiene una solución directa de esa manera, pero el <a4j:keepAlive> hace básicamente lo mismo. Es sólo afectaría a la judía "todo", por lo que si el bean de datos contiene más de sólo el modelo de datos, es posible considerar a refactorizar. Usted debe tener en cuenta para diseñar el frijol como si es un bean de sesión con ámbito.

Si el modelo de datos se hace grande, entonces se puede imaginar que esto afecta a la memoria del servidor, pero esto no debe dañar realmente mucho si sólo se almacena la visible parte del modelo de datos en la memoria (y por lo tanto no la toda modelo de datos, incluyendo todas las otras páginas). Ver si es mayor que el costo de disparar consultas SQL dobles durante una sola petición HTTP.

Espero que esto ayude.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top