2009-08-03 4 views
5

Ich verwende Oracle 11g für meine Datenbank und die Oracle Streams AQ-Funktion als JMS-Implementierung.Gemeinsame Nutzung von JMS- und Hibernate-Transaktionen in einem Spring MDB mit Oracle Streams AQ?

Nach allem, was ich weiß, sollte es möglich sein, eine Spring-basierte Message-driven POJO (MDP) zu implementieren, die die gleiche Datenquelle für den transaktionalen Datenzugriff und JMS-Transaktionen verwendet - alle ohne XA-Transaktionen (IIRC, dies) wurde als Feature von SpringSource Advanced Pack für Oracle vermarktet.

Ist dies auch mit Hibernate möglich? Im Idealfall würde mein MDP eine JMS-Transaktion starten und eine Nachricht aus einer Warteschlange lesen und dann die Transaktion für den Datenzugriff über Hibernate wiederverwenden. Wenn etwas schief geht, wird die JMS- und Datenbanktransaktion ohne Verwendung von 2-Phasen-Commit (2PC) zurückgesetzt.

Ich bin nicht viel von einem Transaktion Guru, also bevor ich anfangen tiefer zu graben, kann jemand bestätigen, dass dies möglich ist und auch Sinn macht?

Update:
Was ich will, ist eine Implementierung des Shared Transaction Resource pattern. Die sample code demonstriert es für ActiveMQ und JDBC, aber ich muss Oracle Streams AQ und Hibernate verwenden.

Update2: Das Spring Advanced Pack für Oracle hat open sourced als Teil des Spring Data JDBC gewesen und es „bietet die Möglichkeit, einen einzelnen lokalen Transaktions-Manager sowohl für den Zugriff Datenbank und die Nachricht verwenden, ohne 2 bis teuer verteilt greifen -phase commit Transaktionsverwaltung ".

Antwort

3

2PC sollte nicht notwendig sein, wie du sagst, da der Appserver sich darum kümmern sollte. Sie müssen jedoch ziemlich genau JTA-Transaktionen (d. H. JavaEE-Container) anstelle von Vanilla-DataSource-Transaktionen verwenden, da JMS nur mit JTA arbeitet.

Das ist keine große Sache, es ist nur ein bisschen mehr knifflig:

  1. Ihr Frühling Config <jee:jndi-lookup/> zu bekommen einen Bezug auf Ihren Container, DataSource verwenden soll, und Sie injizieren, dass Datenquelle in Ihre federgeführte Hibernate SessionFactory.
  2. Sie müssen dann einen Transaktionsmanager in den Kontext einführen (<tx:jta-transaction-manager/> sollte in den meisten App-Servern funktionieren).
  3. Schließen Sie in Ihrem Spring JMS MessageListenerContainer den obigen Transaktionsmanager-Verweis an.

Macht das alles Sinn, oder sollte ich es ausarbeiten? Diese Konfiguration sollte sicherstellen, dass die Container-verwalteten Transaktionen über JMS und Hibernate-Interaktionen gehalten werden.

+0

+1. Ich frage mich jedoch, "alles ohne XA-Transaktionen (IIRC, wurde dies als eine Funktion von SpringSource Advanced Pack für Oracle vermarktet") Aussage. Ich bin ziemlich positiv, dass jede Transaktion, die sich über mehrere Knoten (z. B. JMS und DA) erstreckt, XA-Transaktion sein muss und 2PC verwenden muss - während dies normalerweise durch Container hinter der Szene geschieht, ist es dennoch getan. Liege ich falsch? Gibt es eine neue erstaunliche Technologie, die das irgendwie überflüssig macht? – ChssPly76

+0

Danke für Ihre Kommentare. Ich habe meine Frage aktualisiert, nachdem ich etwas tiefer gegraben habe. Wie in dem Artikel beschrieben, den ich verlinkt habe, möchte ich JTA und XA insgesamt vermeiden. Die Dokumentation für [SpringSource Advanced Pack für Oracle] (https://www.springsource.com/products/enterprise/oraclepack) (herunterladen [hier] (http://www.springsource.com/downloads/springsource-advanced-pack -for-oracle-database-download)) erwähnen Sie auch diese Passibilität (siehe den letzten Abschnitt von Kapitel 3.2, der hier leider zu lang ist). –

+1

Es gibt keine Möglichkeit, TX-Koordination über Datenquellen und JMS ohne JTA zu bekommen. – skaffman