2009-05-08 8 views
4

Angenommen, ich möchte einen Anwendungscontainer implementieren. Kein vollständiger Java EE-Stack, aber ich muss JDBC-Ressourcen und -Transaktionen Zugriff auf Code von Drittanbietern bereitstellen, der in einer Anwendung bereitgestellt wird, die ich gerade schreibe.Was muss ich tun, um JTA in eine Java SE-Anwendung zu integrieren?

Angenommen, ich betrachte JBossTS für Transaktionen. Ich bin nicht damit einverstanden, aber es scheint die beste Lösung für das zu sein, was ich tun muss, soweit ich das beurteilen kann.

Wie integriere ich die Unterstützung für Bereitstellung von Verbindungsressourcen und JTA-Transaktionen in meine Java SE-Anwendung?

+2

JBoss TM ist schrecklich. Zumindest, wenn Sie auf ACID-Transaktionen hoffen. Das Beste, was man dazu sagen kann, ist, dass es wahrscheinlich nicht versauen wird, solange es nicht mit Fehlern zu kämpfen hat. Und es ist nicht allein ... die meisten Transaktionsmanager (sogar einige kommerzielle) funktionieren wirklich nicht. Sie müssen sie streng testen, wie ich in meiner vorherigen Antwort gesagt habe. http://stackoverflow.com/questions/777636/what-is-a-good-open-source-j2se-jta-transactionmanager-implementation – erickson

+0

Wenn es so schlimm ist, muss ich die Alternativen in Betracht ziehen. Bitronix verwirrte den Mist aus mir, als ich versuchte, herauszufinden, wie man es benutzt, also ... nun, also diese Frage. –

+0

@erickson, wenn du eine Aussage wie JBossTM machen willst, ist das schrecklich - gib wenigstens ein paar Gründe an. –

Antwort

1

ich gewählt hat die Bitronix Transaction Manager zu verwenden, um dieses Problem zu lösen, obwohl sie offenbar zumindest eine andere Option ist, die nicht offensichtlich mir zu der Zeit (Atomikos) war.

Die Lösung führte dazu, dass ich auch den Tomcat-In-Process-JNDI-Provider benötigte, um die Transaktion mit einem JNDI-Namen zu verknüpfen. Aufgrund einer Einschränkung dieses Anbieters konnte ich den Standardnamen für eine JTA UserTransaction nicht verwenden, was nicht sofort aus der Dokumentation hervorgeht.

Vielen Dank an alle für die hilfreiche Antworten auf jeden Fall!

2

Das Rad nicht neu erfinden. Verwenden Sie die Spring Framework. Es bietet bereits diese Funktionalität und vieles mehr.

+0

Das "viel mehr" ist nicht unbedingt eine gute Sache. – erickson

+1

erickson, du hast es dort hingenagelt. Spring führt ein Programmiermodell mit, das nicht mit dem funktioniert, was ich tun möchte. –

+0

Nun, Sie können einfach die gewünschte Funktionalität verwenden und den Rest ignorieren, aber wenn Sie das DI-Stil-Programmiermodell nicht verwenden können, stimme ich zu, dass es nicht viel Sinn macht, es zu verwenden. Es scheint nur eine Verschwendung von Aufwand, ein vergleichbares Framework zu erstellen, es sei denn, das ist das Geschäft, in dem Sie sich befinden. – Robin

2

Sie können Frühling verwenden, so sehr ich nicht so scharf bin.

Ein Beispiel, was Sie wollen könnte, ist here

+1

Spring bietet keinen TransactionManager, es hat nur eine Zusammenfassung für Transaktionen. –

2

JTA unterstützt lokale Transaktionen und globale Transaktionen.

Lokale Transaktionen können leicht durch Spring, JPA oder sogar manuelle Commits auf Verbindungen behandelt werden.

Globale Transaktionen REQUIRE ein Transaktionskoordinator. Das ist ein separates Produkt/eine separate Bibliothek, die in Open Source nicht verfügbar ist (zumindest weiß ich es nicht).

Also, wenn ich auf die Kopfzeile Ihres Beitrags ("JTA") schauen, ist die Antwort NO SIMPLE WAY.

Wenn ich Ihre Buchung selbst lesen ("Zugriff auf JDBC Ressourcen und Transaktionen bieten"), würde ich sagen Spring, JPA und Hibernate alle würden Ihre Bedürfnisse (wie ich sie verstanden) decken.

P.S. : JTA unterstützt nicht wirklich lokale Transaktionen (wie Leute mich hingewiesen haben), aber ein Fall, wenn Sie nur eine einzige Verbindung benötigen, ist im Wesentlichen eine lokale Transaktion, auch wenn von JTA gesteuert, insbesondere wenn Transaction Manager ist in der gleichen JVM (wie es oft vorkommt).

7

Wie integriere ich die Unterstützung für Bereitstellung von Verbindungsressourcen und JTA Transaktionen in meine J2SE-Anwendung?

Hallo Chris

Es gibt zwei Elemente für dieses Problem:

1) Herstellung des JTA API, vor allem Usertransaction, zur Verfügung zu Anwendungscode, so kann es Transaktionen beginnen und enden. In einer Java EE-Umgebung wird sie in einem bekannten Speicherort in JNDI veröffentlicht. Wenn Sie über eine JNDI-Implementierung verfügen, ist dies der richtige Weg (verwenden Sie die JNDIManager-Klasse von JBossTS, um Sie bei der Einrichtung zu unterstützen). Andernfalls benötigen Sie eine Art Fabrikobjekt oder Injektionsmechanismus. Natürlich können Sie die Implementierungsklasse auch direkt für den Endbenutzer verfügbar machen, aber das ist etwas unangenehm, da es die Wahrscheinlichkeit begrenzt, dass die JTA in der Zukunft ausgetauscht wird.

Das ist es - Sie können jetzt beginnen, Commit und Rollback-Transaktionen. Einige Container veröffentlichen die TransactionManager-Klasse auch auf ähnliche Weise für Anwendungen, aber sie ist wirklich für die Verwendung durch den Container selbst konzipiert und wird selten vom Anwendungscode benötigt.

2) Automatisches Einbinden von XAResources. Ressourcenmanager, d. H. Datenbanken und Nachrichtenwarteschlangen, haben Treiber, die XAResource implementieren. Jedes Mal, wenn die Anwendung eine Verbindung zum Ressourcenmanager erhält, muss eine entsprechende XAResource an die JTA-Implementierung übergeben werden, damit sie den Ressourcenmanager als Teil des 2PC ansteuern kann. Die meisten App-Server verfügen über einen JCA, der dies automatisch verarbeitet. In Umgebungen ohne eine benötigen Sie eine Alternative, um den Anwendungscode zu speichern, um diese lästige Aufgabe von Hand zu erledigen. Der mit JBossTS gebündelte TransactionalDriver verarbeitet dies für JDBC-Verbindungen. XAPool kann auch eine Überlegung wert sein.

JBossTS wurde im Laufe der Jahre in viele Umgebungen integriert. Einige der gelernten Lektionen werden im Integrationshandbuch dokumentiert http://anonsvn.jboss.org/repos/labs/labs/jbosstm/trunk/atsintegration/docs/] und wenn Sie an einem Beispiel möchten Sie an der tomcat Integrationsarbeit http://anonsvn.jboss.org/repos/labs/labs/jbosstm/workspace/jhalliday/tomcat-integration/]

JBoss des TM ist schrecklich aussehen könnte. Zumindest, wenn Sie auf ACID-Transaktionen hoffen.

Hallo erickson

Das glaube ich nicht, dass ich ganz so weit gehen würde, als ‚schrecklich‘. Es ist unglaublich leistungsfähig und hochgradig konfigurierbar, was das "out of box" -Erlebnis für Einsteiger etwas entmutigend machen kann. Die korrekte Wiederherstellungskonfiguration ist besonders schwierig, daher unterstütze ich Ihren Kommentar zu rigorosen Tests. Darüber hinaus sind mir keine dokumentierten Testfälle bekannt, in denen es derzeit keine ACID-Ergebnisse liefert, wenn sie mit spezifikationskonformen Ressourcenmanagern verwendet werden. Wenn Sie einen solchen Fall oder einfach nur konstruktivere Verbesserungsvorschläge haben, informieren Sie JBoss bitte, damit das Problem behoben werden kann.

Das Rad nicht neu erfinden. Verwenden Sie das Spring Framework. Es bietet bereits diese Funktionalität und vieles mehr.

-1 Spring bietet keine JTA-Implementierung, nur einen Wrapper für verschiedene 3rd Party. Dies ist ein häufiges Missverständnis.

JTA unterstützt lokale Transaktionen und globale Transaktionen.

Ein weiteres Missverständnis fürchte ich. Die JTA-Spezifikation befasst sich nur mit XA, d.h. globalen Transaktionen. Verschiedene gut bekannte Techniken existieren, um einen JTA-Transaktionsmanager zu veranlassen, lokale Transaktionen zu steuern. In der Regel wird die Verbindung in eine XAResource eingebunden. Obwohl die meisten Implementierungen dies unterstützen, liegt es außerhalb des Anwendungsbereichs der Spezifikation. Daher müssen Sie sich bei dem Anbieter erkundigen, bevor Sie eine JTA-Implementierung auswählen, wenn Sie dieses Verhalten benötigen.

+0

Sie haben Recht, JTA ist nur für XA. Dennoch verwenden einige Leute es für eine einzelne Verbindung, in diesem Fall unterscheidet es sich kaum von einer lokalen Transaktion. Sorry für schlampige Erklärung. –

3

Versuchen Sie Atomikos TransactionsEssentials.

Im Gegensatz zu konkurrierenden Open-Source-JTA/XA-Implementierungen wurde diese von Anfang an für JSE geschrieben. Folglich bietet es Premium-JDBC- und JMS-Pools sowie JTA/XA-Funktionalität und Sie können es sehr einfach in Ihre Anwendungen integrieren.

Beste Guy

2

"JBoss's TM ist schrecklich. Zumindest, wenn Sie auf ACID-Transaktionen hoffen. Das Beste, was man dazu sagen kann, ist, dass es wahrscheinlich nichts vermasselt, solange es nicht mit Ausfällen zu kämpfen hat Und es ist nicht allein ... die meisten Transaktionsmanager (sogar einige kommerzielle) funktionieren wirklich nicht. "

Nicht sicher, welche Hausaufgaben Sie getan haben, um die obige Aussage zu machen, aber JBossTS (das TM in JBoss seit 2006, als es erworben wurde) bietet vollständige ACID Semantik. Es war ursprünglich auch Teil der HP NetAction-Suite, in der es in geschäftskritischeren Anwendungen eingesetzt wurde als alle anderen Open-Source-TMs.

+0

+1 Ich habe immer gute Dinge über ArjunaTS gehört (für Interessierte gibt es einen netten [thread] (http://www.theserverside.com/news/thread.tss?thread_id=37941) auf TSS). –