JSF + Hibernate: Performance steigern durch weniger Datenbankzugriffe

Studdi23

Grünschnabel
Hallo,

folgendes Szenario: Die Seite einer JSF-Anwendung wird mit dem Inhalt einer Datenbanktabelle unter Nutzung von Hibernate gefüllt. Die Daten der Tabelle sind sehr umfangreich und können mit einem Filter eingeschränkt werden. Die einzelnen Tabellenzeilen sind außerdem editierbar. Hierzu werden die Werte der ausgewählten Zeile auf einer neuen Seite dargestellt. Es existieren jeweils Buttons zum Speichern und Löschen des Eintrags. Das Problem ist, nachdem ein Eintrag gelöscht wurde, aktualisiert sich die View nicht von selbst, so daß der bereits gelöschte Eintrag nach Umleitung auf die Seite mit der Datenabfrage immer noch zu sehen ist. Als Zwischenlösung rufe ich direkt nach der delete()-Anweisung erneut createQuery() mit den Abfragekriterien auf. Diese Lösung ist aber nicht sehr effektiv und wirkt sich bei häufigen Abfragen negativ auf die Performance aus. Hibernate bietet da sicher elegantere Lösungen mit denen man sich zusätzliche Datenbankzugriffe nach einem INSERT/UPDATE/DELETE einsparen kann. Ich vermute das ich mit dem Query Cache und/oder 2nd Level Cache arbeiten muß, weiß aber nicht wie ich das nutzen soll, um damit mein DataModel für die Darstellung zu aktualisieren. Für hilfreiche Tipps (eventuell mit Code-Beispielen) wäre ich sehr dankbar.
 
hi,
ich gehe mal davon aus dass deine managed bean wegen der performance im session scope ist.
deswegen wird die tabelle nicht aktualisiert.
installiere einen observer der der bean sagt sie soll die tabelle neu laden soll, sobald sich etwas geändert hat.
oder sie soll das akualiserte objekt austauschen. d.h. wenn bei der tabelle was selektiert wird würde ich das objekt direkt aus der tabelle holen aktualsieren und speichern und das aktualisierte objekt wieder in die tabelle zurück schieben.
 
Hi,

danke erstmal für die Antwort. Ja die ManagedBean liegt im Session-Scope. Einen Observer zu installieren ist nicht notwendig, da ein Klick auf den Löschen-Button bereits eine Änderung in der Tabelle signalisiert und man direkt darauf reagieren kann. Den veränderten bzw. gelöschten Eintrag manuell aus der Tabelle zu entfernen ist eher eine dirty solution und recht umständlich wie ich finde. Strebe ehrlich gesagt eine Lösung auf Datenbankebene an, da ich mich ohnehin mehr mit Hibernate auseinandersetzen wollte und die Anwendung generell performanter werden soll. Ich muß irgendwie den Hibernate-Cache in Kenntnis darüber setzen, das sich die Ergebismenge der aktuellen Datenbankabfrage geändert hat und mein DataModel mit dem neuen Inhalt refreshen. Das ganze müsste direkt nach dem delete() erfolgen und sollte, ohne ein weiteres SELECT abzusetzen, möglich sein.Bin mir ziemlich sicher das das mit Hibernate-Boardmitteln geht, aber meine Kenntnisse sind in dieser Hinsicht leider noch etwas mau. Vielleicht findet sich ja noch einer der da um einiges besser bewandert ist.
 
Zuletzt bearbeitet:
Zurück