2016-10-04 2 views
2

Ich gebe eine detaillierte Erklärung des Anwendungsflusses, den ich in meiner Anwendung habe. Ich arbeite an einer Datenbank-Viewer-Anwendung. Der Benutzer kann alle Datensätze (Zeilen) in meiner Datenbank mit dieser Anwendung anzeigen und über die Benutzeroberfläche bearbeiten. Diese Anwendung funktioniert gut. Jetzt möchte ich die Optimistische Sperre implementieren, für die ich ein Versionsfeld in der DB erstellt habe. Nun schlug ich mit einem Design-Problem,Spring MVC Ruhezustand Java-Objekt zwischen Antwort und Anfrage speichern

Bis jetzt in meiner Anwendung, wenn ein Benutzer den Datensatz anzeigen und will es bearbeiten, in meiner Controller-Methode mir eine Ruhelast tue und das Ergebnis in bearbeiten JSP-Seite angezeigt werden. Jetzt, wenn ein Benutzer auf der Seite auf "Speichern" klickt, muss ich den Datensatz speichern. Da es sich um eine sehr komplexe Entität handelt, befülle ich diese Entität erneut aus DB und führe die Änderungen durch und führe das Speichern oder Aktualisieren von Hibernate aus.

Nun möchte ich die Versionierung implementieren, sodass ich die Entität nicht mehr füllen möchte, bevor ich sie speichere oder aktualisiere. Irgendwie möchte ich meine komplexe Entität sicher halten und diese nutzen, wenn ich updaten möchte. JSP versteckte Formularfelder sind in meinem Fall nicht möglich. Wo kann ich meine Entität sicher aufbewahren, bis der Benutzer auf die Schaltfläche "Speichern" klickt und sie verwendet, um in db zu bleiben? Was sind die möglichen und besten Ansätze?

Update:

ich verschiedene Beiträge in Internet und Planung überprüft haben ehcache Rahmen umzusetzen.

+2

Die Sitzung wäre ein naheliegender Ort. http://docs.oracle.com/javaee/5/api/javax/servlet/http/HttpSession.html –

+0

@AlanHay Aber irgendwie, wenn ich jetzt (session.getAttribute ("obj")). gleich (DAO. get (...)) stimmen nicht überein. Ich werde falsch. Ich habe eqauls Methode auf allen Mitgliedsvariablen des Gegenstandes überprüft. Sie sollten gleich sein, oder? – EagleRider

Antwort

1

Sie haben zwei Möglichkeiten:

Lagern Sie den Zustand auf dem Server (in der Sitzung) oder auf dem Client (in versteckten Formularfeldern). Sie können Client-Daten mit einem HMAC schützen, aber das erfordert Bearbeitungszeit. Spring MVC: Validation, Post-Redirect-Get, Partial Updates, Optimistic Concurrency, Field Security

+0

Vielen Dank @Neil – EagleRider

+0

Gibt es eine andere Möglichkeit als die Verwendung der Sitzung?. Warum ich darauf beharre ist, wir wollen den Server nicht überlasten (wir wollen den Speicherverbrauch für weitere Sitzungen stoppen). Gibt es eine Möglichkeit, das Objekt mithilfe des Zwischenspeicherns im Zwischenspeicher oder der Unterstützung von Drittanbietern zu cachen? – EagleRider

+0

@EagleRider Sie können den Status in versteckten Formularfeldern im Browser speichern –

0

Das ist, was @SessionAttributes für ist: Ich würde serverseitige Sitzung für Bequemlichkeit

Meine Antwort umfasst hier ein Beispiel, wie die Verwendung Sitzung mit optimistischen Sperren empfehlen. Unabhängig davon, wie Sie das Objekt irgendwo speichern müssen, können Sie versuchen, Ihre eigenen Daten zu finden und eine Standardlösung zu verwenden.

Unabhängig von der Art der Implementierung müssen Sie Ihre Daten (teilweise) noch im Speicher haben. Und wie bereits erwähnt, können Sie versuchen, Ihre eigene Lösung zu hacken oder den Standard-Federmechanismus zu verwenden.

Lösungen wie EhCache cachen noch Dinge im Speicher, können bei Bedarf auf andere Speicher ausgelagert werden. Dasselbe können Sie für Ihre Sitzungen konfigurieren (abhängig von Ihrem Container). Oder verwenden Sie etwas wie Spring Session, um verschiedene Optionen zu haben.

Wie auch immer ich würde beginnen mit der Speicherung in der Sitzung, dann starten Sie die Messung und wenn es wirklich ein Problem wird, finden Sie eine andere Möglichkeit, Ihre Entitäten zwischen Anfragen zu speichern. Aber beginnen Sie einfach, messen Sie und verbessern Sie dann, anstatt zu versuchen, Probleme zu lösen, die auftreten könnten.

+0

@ m-deinum Problem mit Sitzung in meinem Fall ist die verteilte Produktionsumgebung. Sie sind keine Garantie dafür, dass jede Anfrage auf dem gleichen Server ausgeführt wird. Wie kann ich die Sitzung in diesem Fall verwenden? – EagleRider

+0

Wie bereits erwähnt, können Sie Spring Session verwenden (der Link ist in der Antwort enthalten). –

Verwandte Themen