JPA EntityManager-Sitzung ungültig machen

8

Ein Projekt, an dem ich gerade arbeite, verwendet Spring 2.5 & amp; JPA mit Hibernate als Provider.

Meine DAO-Klassen erweitern JpaDaoSupport, daher erhalte ich meine JpaTemplate mit der getJpaTemplate () -Methode.

Die Back-End-Datenbank kann entweder von meiner Anwendung oder einer Anwendung eines Drittanbieters geändert werden.

Wenn eine Anwendung eines Drittanbieters die Datenbank ändert (hauptsächlich Konfigurationsdatenänderungen), muss ich dem Benutzer meiner Anwendung eine Möglichkeit geben, alle JPA-Sitzungen ungültig zu machen und die neuen Daten neu zu laden (dh alle Hibernate-Sitzungen im Hintergrund ungültig zu machen) ). Dies muss von allen gleichzeitigen Benutzern meiner Anwendung "gesehen" werden.

Wie kann ich das tun?

    
dasp 08.03.2010, 09:53
quelle

2 Antworten

21

Es gibt zwei Ebenen von Caches:

  • 1. Ebene ist der Cache des EntityManagers.

    Sie können entweder refresh für eine Entität angeben und es wird von der Datenbank neu geladen, oder Sie können clear den Entity Manager selbst eingeben. In diesem Fall werden alle Entitäten aus dem Cache entfernt. Mit JPA gibt es keine Möglichkeit, nur eine bestimmte Einheit zu vertreiben aus dem Cache. Abhängig von der Implementierung, die Sie verwenden, können Sie dies tun, z. Hibernate's evict Methode.

  • Das Zwischenspeichern auf der zweiten Ebene ist der globale Cache.

    JPA 1.0 bietet keine Unterstützung für den Cache der zweiten Ebene. Sie müssen sich dann auf die zugrunde liegende spezifische Implementierung verlassen oder sie deaktivieren. JPA 2.0 wird dieses Problem beheben mit @Cache Annotation und der Cache-API. Sie können den Cache der 2. Ebene mithilfe der Hibernate-spezifischen API, z. SessionFactory.evict(...) .

Erweiterte Probleme beim Caching sind:

  • Abfragecache

    Das Ergebnis bestimmter Abfragen kann zwischengespeichert werden. Auch dies wird in JPA 1.0 nicht unterstützt, aber die meisten Implementierungen können angeben, welche Abfrage zwischengespeichert wird und wie.

  • Clustering

    Dann kommt auch das langwierige Problem des Synchronisierens von Caches zwischen Knoten in einem Cluster. In diesem Fall hängt dies hauptsächlich von der verwendeten Caching-Technologie ab, z. JBoss-Cache.

Ihre Frage ist immer noch irgendwie generisch und die Antwort hängt davon ab, was Sie gerade tun.

Ich habe an einem System gearbeitet, bei dem viele Updates durchgeführt wurden, ohne den Ruhezustand zu durchlaufen, und wir haben schließlich den Cache der zweiten Ebene deaktiviert.

Sie können aber auch alle geöffneten Sitzungen im Auge behalten und bei Bedarf alle Caches der ersten Ebene aller geöffneten Sitzungen sowie den Cache der zweiten Ebene löschen. Sie müssten die Synchronisation dennoch selbst verwalten, aber ich kann mir vorstellen, dass es möglich ist.

    
ewernli 08.03.2010, 09:56
quelle
1

Aus architektonischer Sicht ist es keine gute Idee, eine andere Anwendung die gesamte Geschäftslogik umgehen zu lassen und persistente Daten zu ändern. Es macht den Boden unter den Füßen Ihrer Anwendung in vielerlei Hinsicht wackelig:)

Wäre es nicht sinnvoll, sich mit diesem anderen System eleganter zu integrieren, zum Beispiel durch Nachrichtenverarbeitung oder Stapelverarbeitung. Der Frühling hat große Unterstützung für beide.

    
Hans Westerbeek 08.03.2010 22:59
quelle