Gegeben ein <p:dataTable>
Rendering von Bildern in einer der Spalten.
Die Datentabelle kann bei Bedarf weitere wichtige häufig verwendete Attribute und Spalten enthalten.
Wenn diese Tabelle (ajaxisch) aktualisiert wird, werden alle Bilder aus der Datenbank (oder dem Dateisystem des Laufwerks, falls verwendet) abgerufen, als ob sie überhaupt nicht vom Browser zwischengespeichert würden, obwohl cache
explizit auf% co_de gesetzt ist % (das ist der Standardwert). Dies funktionierte bisher gut mit PrimeFaces 5.3 final.
Im Migrationsleitfaden wird nichts darüber gesagt, aber anscheinend wurde etwas beim Zwischenspeichern von true
geändert.
Irgendwelche Vorschläge, um das Problem zu beheben?
Wenn im obigen Beispiel die Tabelle beispielsweise 5 Bilder in 5 Zeilen enthält, wird die Datenbank bei jeder einzelnen Aktualisierung für <p:graphicImage>
10-mal abgefragt (mit Ausnahme der Inline-Zeilenbearbeitung, die standardmäßig der aktuellen Zeile entspricht). was nicht passieren sollte, da das Abrufen von Bildern besonders aus einer Datenbank sehr kostspielig ist.
Request / Response-Header mit PrimeFaces 6.0 final (läuft auf WildFly 10.0.0 final), wenn eine erste Anfrage an den Server gestellt wird, ein Image zu liefern (funktioniert nicht - Images werden nicht zwischengespeichert).
%Vor%Request / Response-Header mit PrimeFaces 5.3 final (läuft auf GlassFish 4.1), wenn eine erste Anfrage an den Server gestellt wird, ein Image zu liefern (funktioniert wie vorgesehen - Images werden zwischengespeichert).
%Vor% Header sehen gut aus. Dies deutet darauf hin, dass sich etwas in Abfragezeichenfolgenparametern von Anforderung zu Anforderung ändert. Dies würde auch als eine brandneue Ressource interpretiert werden und somit das Caching aufheben, obwohl der Basis-URI (das Teil vor dem URL-Abfragezeichenfolgentrennzeichen ?
) genau gleich ist.
Tatsächlich hat PrimeFaces 6.0 die Art und Weise geändert, wie der Abfragezeichenfolgenparameter pfdrid
generiert wird. Es wurde zu einem völlig zufälligen UUID
, das sich jedes Mal ändert, wenn der HTML <img src>
gerendert wird. Siehe auch Zeile 59 des PF 6.0-Quellcodes . In PrimeFaces 5.3 wurde es basierend auf der EL-Ausdruckszeichenfolge verschlüsselt und ist somit garantiert für alle Anfragen gleich, solange die EL-Ausdruckszeichenfolge gleich ist. Siehe auch Zeile 53 des PF 5.3-Quellcodes .
Die Änderung wurde von Cagatay ohne einen Hinweis auf ein Problemticket eingeführt. Es bleibt also unklar, warum genau diese Änderung vorgenommen wurde. Aber schließlich bietet es dem Kunden nicht mehr die Möglichkeit, den dynamischen Inhalt zwischenzuspeichern und würde somit die Leistung in beiden Bereichen verringern. Dies ist definitiv ein Ausgabeticket bei PrimeFaces wert, also habe ich eines erstellt: Ausgabe 1765 .
Ich sehe keinen sauberen Weg, dies zu lösen, als den PrimeFaces Quellcode zu hacken. Am besten ersetzen Sie <p:graphicImage>
durch <h:graphicImage>
durch ein "plain vanilla servlet" oder verwenden Sie die JSF-Dienstprogrammbibliothek OmniFaces , dann die <o:graphicImage>
mit einer einfachen Bean. Diese Ansätze sind bereits in diesem Zusammenhang ausführlich beschrieben: Bild als Byte [] aus der Datenbank als Grafikbild auf der JSF-Seite anzeigen .
Update : Gemäß Problem 1765 wurde es für PrimeFaces 6.1 behoben .
Tags und Links caching jsf primefaces graphicimage