Ist es in Ordnung, DataSourceTransactionManager für ORM-Persistenz anstelle von HibernateTransactionManager zu verwenden?

8

Ich debugge unsere Webapp. Es ist so konfiguriert, dass beim Start eine DataSourceTransactionManager-Bean und auch eine HibernateTransactionManager-Bean erstellt wird. Dies ist nicht beabsichtigt, sondern wird durch eine Drittanbieterabhängigkeit verursacht. Der Effekt scheint gutartig zu sein. Was ich über das Debugging sehe, ist, dass, wenn wir ein Objekt über ein Hibernate-basiertes DAO persistieren - der DataSourceTransactionManager aufgerufen wird und nicht der HibernateTransactionManager (die Beans heißen beide 'transactionManager'). Der Frühling Javadoc impliziert (ich denke, es jetzt neu zu lesen), das ist gut für lokale Ressourcen - das ist unsere Situation. I.e. es ist keine verteilte JTA-basierte Umgebung.

Meine Frage ist - hat es negative Auswirkungen, dass der HibernateTransactionManager für ORM-basierte Persistenz nicht verwendet wird? Ich kann die Konfiguration ändern, um den HibernateTransactionManager über ein Qualifikationsmerkmal für die @Transactional Annotation auf unseren DAOs zu verwenden.

Die Dinge funktionieren im einfachen Komponententest, der Integrationstesteinrichtung, aber ich mache mir mehr Sorgen über die Skalierung auf volle Produktionsvolumina, wenn wir Tausende von Benutzern und einen hohen Grad an Gleichzeitigkeit haben.

TIA, hoffe, das ist nicht zu dunkel.

Frühling 3.0.x BTW.

Dies ist in der Frühjahr 3.1 Dokumentation.

  

Abschnitt 11.9 "Lösungen für häufig auftretende Probleme".

     

Verwenden Sie die richtige PlatformTransactionManager-Implementierung basierend auf   Ihre Wahl der Transaktionstechnologien und Anforderungen.

    
David Victor 14.11.2011, 13:38
quelle

1 Antwort

6

Das würde mich als falsch empfinden und Probleme verursachen. Ohne den Hibernate-Txn-Manager werden alle Aufrufe von HibernateOperations außerhalb einer Transaktion und in einer separaten Sitzung ausgeführt, möglicherweise mithilfe von Auto-Commit. Es kann also so aussehen, als wäre alles in Ordnung, wenn ein Fehler auftritt, können Sie feststellen, dass Änderungen, die Sie erwarten würden, nicht rückgängig gemacht werden.

Versuchen Sie Folgendes, um

zu überprüfen
  • beginne tran
  • etwas speichern
  • throw Ausnahme
  • commit

Überprüfen Sie, ob das 'Etwas' in der DB erscheint oder nicht.

Eine weitere Überprüfung wäre

  • beginne tran
  • Laden Sie etwas
  • Zugreifen auf eine Beziehung zu einem anderen Objekt von etwas und Zugriff auf eine Eigenschaft (nicht die PK) dieses verwandten Objekts

Sie können feststellen, dass der letzte Aufruf eine Ausnahme verursacht, da die Sitzung nicht vom Ladevorgang aus geöffnet wurde, weil der einschließende TXN nicht vom Manager für den Ruhezustand txn verwaltet wird.

    
Mike Q 14.11.2011, 14:14
quelle

Tags und Links