Mit Hilfe von JTA im Rahmen einer globalen Transaktion wenige Abfragen an verschiedene Datenquellen gleichzeitig ausführen

8

Ich habe eine Anwendung mit 3 verteilten dataSources (com.atomikos.jdbc.AtomikosDataSourceBean). Ich verwende Atomikos Transaktionsmanager als JTA-Implementierung. Jede dataSource arbeitet mit der PostgreSQL-Datenbank zusammen. Jetzt rufe ich meine Abfragen konsequent für jede dataSource auf, und alles funktioniert einwandfrei.

Ich frage mich, ob es möglich ist, mit JTA meine Abfragen parallel (Multithreading, gleichzeitig) aufzurufen?

Ich habe versucht, einfach die Abfrage im neu erstellten Thread mit jdbcTemplate (Spring) aufzurufen. Erstens habe ich eine Frühjahrsausgabe gesehen. Spring speichert den Transaktionskontext im ThreadLocal-Feld. Daher wurde es in meinem neuen Thread ( Spring) nicht richtig aufgelöst Transaktionsmanager und Multithreading ). Ich habe dieses Problem gelöst, indem ich den gleichen Transaktionskontext in ThreadLocal des neu erstellten Threads gesetzt habe. Aber das gleiche Problem sehe ich im Atomikos-Code. Sie speichern auch den CompositeTransactionImp in der Map mit dem Thread-Bereich (BaseTrancationManager # getCurrentTx). Aber im Atomikos-Fall ist es nicht möglich, dort Werte für einen neuen Thread festzulegen. Daher kann ich meine Abfragen nicht gleichzeitig ausführen, da Atomikos diesen Ansatz anscheinend nicht unterstützt. Aber ich habe auch die JTA-Spezifikation durchgesehen und folgendes gefunden: "Mehrere Threads können gleichzeitig derselben globalen Transaktion zugeordnet sein." ("3.2 TransactionManager-Schnittstelle", Ссылка )

FRAGE: Wie kann ich im Rahmen einer globalen Transaktion zwei oder mehrere Abfragen gleichzeitig an verschiedene dataSources mit JTA (2 phase commit) aufrufen?

DataSources-Konfiguration im Tomcat-Kontext:

%Vor%

Konfiguration des Transaktionsmanagers im Frühling:

%Vor%

Code:

%Vor%     
Vladislav Bauer 17.09.2013, 10:22
quelle

1 Antwort

1

Ich denke, Ihre Idee, die Tatsache, dass TransactionSynchronizationManager mit Single-Thread-Transaktionen spielen muss, zu umgehen, ist zwar interessant, aber wahrscheinlich gefährlich.

Im TransactionSynchronizationManager werden die Transaktionsressourcen in einer ThreadLocal Map gespeichert, wo der Schlüssel die Ressourcenfactory ist und ich frage mich, was anhängen wird, wenn Sie diese Problemumgehung mit mehreren Threads unter Verwendung derselben Ressourcenfactory ausführen - wahrscheinlich nicht gelten in Ihrem Fall, da Sie 3 Datenquelle haben -. (Auf den ersten Blick würde ich sagen, dass eine Ihrer Transaktionsressourcen durch eine andere ersetzt wird, aber vielleicht verpasse ich etwas ...).

Wie auch immer, ich denke, Sie können versuchen, die javax.transaction.TransactionManager.resume () um zu erreichen, was Sie zu tun versuchen.

Die Idee ist, die JTA api direkt zu verwenden und so Single-Thread-Spring-Transaktionen zu umgehen.

Hier ist ein Code, um zu veranschaulichen, was ich vorhabe:

%Vor%

Ich denke, dass diese Lösung funktionieren kann (ich muss sagen, dass ich es selbst nicht versucht habe). Die einzige Einschränkung, die ich jetzt sehe, ist, dass Sie die Threads nicht mehr verwenden können, weil es keinen Gegenpart zum resume () -Aufruf gibt und beim zweiten Aufruf von resume () wahrscheinlich eine IllegalStateException auftreten wird.

    
ben75 17.09.2013, 11:54
quelle