Question

Mise à jour II: OK, j'ai réussi à le réduire un peu.

J'ai une page avec un datatable avec tri et fonctionnalités de filtrage, à la fois en cours dans le DB. En d'autres termes, je ne pas utiliser la fonctionnalité intégrée des riches: datatable Je l'utilise, mais plutôt laisser le DB faire le travail

.

Je travaille avec Demande-scope haricots. Les seuls haricots scope-séance contiennent le tri et le filtrage de mon interface.

filtrage pour chaque colonne est lié aux certains champs de fèves de session. En tant que tel, il est effectivement mis à jour pendant la phase de mise à jour des valeurs Modèle.

Le tri requis une logique de ma part, donc j'invoque une certaine méthode pour définir les valeurs correctes à la fève de session. Ceci est réalisé lors de la phase d'application Invoke.

Ainsi, les changements sont en place pendant la phase de réponse de rendu, où la page rend réellement.

Le problème est que le JSF datatable et datascroller dans ma page la backingBean.getDataModel() que récupérer les données de la DB et la dataModel.getRowCount() (que je mis en œuvre pour invoquer une méthode qui exécute une requête séparée) aussi au cours de la Appliquer les valeurs de demande phase. Ces deux requêtes ont lieu également au cours de la phase d'intervention de rendu, qui est la seule phase où les changements sont en place, et la requête fonctionne normalement.

Cela signifie que pour afficher une page après avoir effectuer un filtrage ou le tri, le double nombre de requêtes ont lieu.

Je veux effectuer le tri et le filtrage n'effectuant les requêtes nécessaires et plus.

Toutes les suggestions?

Était-ce utile?

La solution

L'appel getter pendant la phase appliquer des valeurs de demande est obligatoire parce que les besoins JSF de savoir quelles valeurs d'entrée ont d'abord été montré de manière à pouvoir éventuellement faire une validation et / ou appeler des valuechangelisteners dans la phase suivante, le cas échéant. Il est également obligatoire de savoir quel bouton / lien a été pressé / cliqué dans l'une des lignes pour qu'il sache quelle action haricot appeler dans la phase d'action Invoke.

Mais si vous ne disposez pas des champs d'entrée qui doivent être validées / ValueChange vérifiées ni aucun boutons / liens dans l'une des lignes, alors je peux imaginer que la requête appliquer lors de la demande des valeurs phase est dans l'œil complètement superflu.

Malheureusement, vous ne pouvez pas désactiver complètement. Techniquement, le seul recours à qui met le grain de données dans le cadre de la session et faire la requête coûteuse SQL (et rafraîchissement de datamodel) que dans le constructeur de la fève et la méthode d'action de haricot, de sorte qu'il s'invoqué que pendant de haricots construction (pour une vue 1er) et pendant la méthode d'action de haricot (au cours d'une nouvelle sorte / filtre / whatever demande). L'inconvénient est cependant que toute modification du modèle de données se reflètent dans toutes les fenêtres / onglets à l'utilisateur final a ouvert dans la même session, ce qui pourrait provoquer des « wtf? » expériences pour l'utilisateur final.

, Tomahawk a été le premier qui a une solution agréable pour cette saveur de l'attribut preserveDataModel pour le <t:dataTable>, qui met essentiellement l'datamodel dans l'arborescence des composants spécifiques à la demande (ce qui est déjà enregistré dans le cadre de la session ou dans un champ caché dans le côté client, selon la façon dont vous avez configuré l'emplacement du magasin de l'état d'affichage dans les faces-config). RichFaces ne dispose pas d'une solution directe comme ça, mais le <a4j:keepAlive> fait essentiellement la même chose. Il ne concernerait que le haricot « tout », donc si votre grain de données contient plus que le modèle de données, vous pouvez envisager de le refactoriser. Vous devez garder à l'esprit pour concevoir le haricot comme si elle est un haricot scope de session.

Si le datamodel devient grand, alors je peux imaginer que cela a un impact de la mémoire du serveur, mais cela ne devrait pas vraiment nuire à beaucoup si vous ne stocke les visualisable de la datamodel en mémoire (et donc pas ensemble datamodel, y compris toutes les autres pages). Voir si elle l'emporte sur le coût de la mise à feu doubles requêtes SQL lors d'une requête HTTP.

Hope this helps.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top