Frage

UPDATE II: OK, ich schaffte es ein wenig nach unten zu verengen.

Ich habe eine Seite mit einer Datentabelle mit Sortier- und Funktionalitäten Filterung, sowohl stattfindet in der DB. Mit anderen Worten, verwende ich nicht die eingebettete Funktionalität der Reichen: Datatable ich Gebrauch, sondern lassen Sie die DB die Arbeit machen

.

Ich arbeite mit Anfrage-scoped Bohnen. Die einzigen Session-scoped Bohnen enthalten die Sortierung und Filterung meiner Schnittstelle.

Filtern für jede Spalte wird auf die bestimmte Session-Bean-Felder gebunden. Als solches aktualisiert wird tatsächlich während des Update-Modell Phasenwerte.

erforderlich Sorting einige Logik von meinem Teil, so dass ich eine bestimmte Methode aufrufen, um die richtigen Werte der Session-Bean zu setzen. Dies wird während der Invoke Anwendungsphase.

Also, irgendwelche Änderungen an Ort und Stelle während der Antwortphase übertragen, wo die Seite rendert tatsächlich.

Das Problem ist, dass die JSF-Datentabelle und datascroller in meiner Seite Aufruf der backingBean.getDataModel(), die die Daten aus der DB und der dataModel.getRowCount() holen (die ich umgesetzt haben, um eine Methode aufzurufen, die eine separate Abfrage ausgeführt wird) auch während der Anfrage Werte gelten Phase. Diese beiden Abfragen nehmen auch während der Render-Antwortphase, die die einzige Phase ist, wo die Veränderungen alle an Ort und Stelle sind, und die Abfrage läuft normal weiter.

Das bedeutet, dass eine Seite zu zeigen, nachdem ich auftrete Filterung oder Sortierung, die doppelte Anzahl der Abfragen erfolgen.

Ich möchte nur ausführen Sortierung und Filterung der benötigten Abfragen durchführen und nicht mehr.

Irgendwelche Vorschläge?

War es hilfreich?

Lösung

Der Getter Anruf während Anforderungswerte Phase anwenden ist obligatorisch, weil JSF wissen muss, welche Eingabewerte zunächst so dargestellt wurden, dass sie schließlich jede Validierung tun können, und / oder rufen Sie alle valuechangelisteners in der nächsten Phase, wo anwendbar. Es ist auch zwingend erforderlich, um herauszufinden, welche Taste / link wurde so in einer der Reihen gedrückt / angeklickt, dass es die Bohne Aktion aufzurufen in der invoke Aktionsphase kennt.

Aber wenn Sie haben keine Eingabefelder, die zu validierenden / Valuechange-geprüft noch irgendwelche Tasten / Links in eine der Zeilen, dann kann ich mich vorstellen, dass die Abfrage während der Anforderungswert Phase gilt im Auge ist vollständig überflüssig.

Leider kann man nicht vollständig deaktivieren. Technisch gesehen greifen die nur zu, dass sie die Daten Bean im Sitzungsbereich setzen und tun, die teure SQL-Abfrage (und Aktualisierung des Datenmodelles) nur im Konstruktor der Bohne und in der Bean-Aktion-Methode, so dass es nur während Bean aufgerufen erhalten Bau (für 1.e Ansicht) und während der Aktion Methode des Beans (während einer neuen Art / Filter / was auch immer Anfrage). Der Nachteil ist jedoch, dass Änderungen in dem Datenmodell in allen Fenstern / Tabs spiegelt die Enduser in derselben Sitzung geöffnet haben, die möglicherweise dazu führen, „wtf?“ Erfahrungen für den Enduser.

Nun Tomahawk die erste war, die für die preserveDataModel eine schöne Abhilfe für diesen in dem Geschmack des <t:dataTable> Attributs hat, das ist im Grunde das Datenmodell in dem anforderungsspezifischen Komponentenbaum legt (die wiederum bereits in dem Sitzungsbereich gespeichert sind, oder in einem versteckten Eingabefeld in der Client-Seite, je nachdem, wie die Speicherstelle des Ansichtszustand in faces-config) konfiguriert. Richfaces keine direkte Lösung wie das, aber die <a4j:keepAlive> tut im Grunde das gleiche. Es würde nur die „ganze“ Bohne beeinflussen, so dass, wenn Ihre Daten Bohne mehr enthält als nur die Datenmodell, könnte man es für Refactoring. Sie sollten im Auge behalten, die Bohne zu entwerfen, als ob es sich um eine Sitzung scoped Bean ist.

Wenn das Datenmodell groß wird, dann kann ich mir vorstellen, dass diese Auswirkungen der Server-Speicher, aber das ist nicht wirklich so viel Schaden zufügen sollten, wenn Sie nur die sichtbar Teil des Datenmodells im Speicher speichert (und also nicht die gesamte Datenmodell, einschließlich aller anderen Seiten). Sehen Sie, wenn sie die Kosten des Brennens Doppel SQL-Abfragen während einer HTTP-Anforderung überwiegt.

Hope, das hilft.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top