Frage

Unser design hat eine jvm, die von jboss/webapp (Lesen/schreiben), die ist verwendet zu verwalten die Daten über hibernate (mit jpa), um die db.Das Modell verfügt über 10-15 persistente Klassen mit 3-5 Ebenen der Tiefe in der Beziehung.

Wir haben dann eine separate jvm, die den server dieser Daten.Wie es läuft kontinuierlich, wir haben nur einen langen db-Sitzung (nur Lesen).

Derzeit gibt es keine intra-jvm cache-beteiligten, so dass wir manuell signal eine jvm von den anderen.

Als nun die webapp ändert einige der Daten, Signale, die den server zu laden, werden die geänderten Daten.Was wir gefunden haben ist, dass wir sagen müssen, hibernate löschen der Daten und Sie dann neu laden.Nur tun eine fetch/merge mit der db nicht den job machen - vor allem in Bezug auf die Objekte, die mehrere Ebenen in der Hierarchie nach unten.

Irgendwelche Gedanken auf, ob es irgend etwas grundlegend falsch mit diesem design haben oder wenn jemand dies tut, und hat mehr Glück gehabt mit der Arbeit mit hibernate auf die reload.

Vielen Dank, Chris

War es hilfreich?

Lösung

Eine Hibernate-session lädt alle Daten, die er liest aus der DB in das, was Sie rufen Sie die first-level-cache.Sobald eine Zeile geladen wird von der DB, alle nachfolgenden holt eine Zeile mit dem gleichen PK zurückkehren wird, die Daten aus diesem cache.Darüber hinaus Hibernate gaurentees Referenz-Gleichheit für Objekte mit dem gleichen PK in einer einzigen Sitzung.

Von dem, was ich verstehe, Ihre nur-lese-server-Anwendung schließt niemals seine Hibernate-session.Also, wenn die DB wird aktualisiert, indem das read-write-Anwendung, die Sitzung auf nur-lese-server ist nichts von der änderung.Effektiv, Ihren nur-lese-Anwendung ist das laden einer in-memory-Kopie der Datenbank und der Verwendung, das kopieren, die bekommt abgestanden zu gegebener Zeit.

Die einfachste und beste Vorgehensweise, die ich vorschlagen kann, ist das schließen und öffnen von Sitzungen als benötigt.Dies umgeht das ganze problem.Hibernate-Sitzungen werden sollen, ein Fenster für eine kurzlebige Wechselwirkung mit der DB.Ich Stimme zu, dass es einen performance-Gewinn durch nicht nachladen der Objekt-graph wieder und wieder;aber Sie müssen es Messen und sich davon überzeugen, dass es lohnt sich die Schmerzen.

Eine andere option ist zu schließen und öffnen Sie die Sitzung regelmäßig.Dadurch wird sichergestellt, dass die nur-lese-Anwendung arbeitet mit Daten, die nicht älter als ein bestimmtes Zeitintervall.Aber es ist definitiv ein Fenster, wo Sie den nur-lese-Anwendung arbeitet mit veralteten Daten (obwohl das design garantiert, dass es wird die up-to-date data-schließlich).Dies könnte zulässig sein, in vielen Anwendungen - Sie brauchen, um Ihre situation einschätzen.

Die Dritte option ist zu verwenden eine second level cache die Umsetzung, und verwenden Sie kurzlebige Sitzungen.Es gibt verschiedene caching-Pakete, die Arbeit mit Hibernate mit relativen Vorzüge und Nachteile.

Andere Tipps

Chris, ich bin ein wenig verwirrt über Ihre Umstände.Wenn ich das richtig verstehe, haben Sie sowohl eine web-app (Lesen/schreiben) eine standalone-Anwendung (nur-lese -?) Einsatz von Hibernate Zugriff auf eine freigegebene Datenbank.Die änderungen, die Sie mit der web-app nicht sichtbar sind, um die standalone app.Ist das richtig?

Wenn ja, haben Sie sich überlegt mit einer anderen second-level-cache-Implementierung?Ich Frage mich, ob Sie vielleicht in der Lage sein, ein clustered-cache, der gemeinsam sowohl von der web-Anwendung und die standalone-Anwendung.Ich glaube, dass SwarmCache, die ist integrierte mit Hibernate, erlauben dies, aber ich habe es nicht versucht, mich.

Im Allgemeinen jedoch, Sie sollten wissen, dass der Inhalt einer bestimmten cache wird niemals bewusst Aktivität von einer anderen Anwendung (das ist, warum ich schlage vor, dass beide apps teilen-cache).Viel Glück!

Aus meiner Sicht ist, sollten Sie Ihre unterstreichen Hibernate-cache, der einen unterstützt, clustered-Modus.Es könnte sein, eine JBoss-Cache oder Schwarm-Cache.Die erste hat eine bessere Unterstützung für die Synchronisation der Daten (Replikation und Abwertung) und unterstützt auch die JTA.

Dann werden Sie in der Lage zu konfigurieren, cache-Synchronisation zwischen webapp und server.Auch ein Blick auf isolation level, wenn Sie die Verwendung von JBoss Cache.Ich glaube, Sie verwenden sollten READ_COMMITTED Modus, wenn Sie wollen, um neue Daten auf einen server aus der gleichen Sitzung.

Das am meisten verwendete Praxis ist eine Container-Managed Entity Manager so, dass zwei oder mehrere Anwendungen in einem container (ie Glassfish, Tomcat, Websphere) teilen sich die gleichen caches.Aber wenn Sie nicht verwenden Sie eine Anwendung, container, weil Sie Spielen!zum Beispiel würde ich dann erstellen Sie einige webservices in der primäre Anwendung Lesen/schreiben konstant in der cache.

Ich denke, mit veralteten Daten ist eine offene Tür für die Katastrophe.Wie Singletons werden Multitons, nur-lese-Anwendungen sind oft eine schreiben Sie manchmal.

Gürtel und Hosenträger :)

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