2010-11-23 7 views
4


Ist die Wiederverwendung der ut-Instanz im folgenden Code korrekt?Kann ich eine UserTransaction-Instanz nach commit() wiederverwenden?

UserTransaction ut = (UserTransaction)ctx.lookup("java:comp/UserTransaction"); 
ut.begin(); 
doSomeWork(); 
ut.commit();//Or rollback (I think it doesn't matter) 
ut.begin(); //Or rollback (I think it doesn't matter) 
doOtherWork(); 
ut.commit(); 

Wenn die JNDI Ressource wird so definiert:

Reference atomikosUserTransactionFactoryDS = new Reference("com.atomikos.icatch.jta.UserTransactionImp", 
       "com.atomikos.icatch.jta.UserTransactionFactory", null); 
atomikosUserTransactionFactoryDS.add(new RefAddr("name") { 
public Object getContent() { 
     return "UserTransaction"; 
}}); 
atomikosUserTransactionFactoryDS.add(new RefAddr("type") { 
    public Object getContent() { 
    return "com.atomikos.icatch.jta.UserTransactionImp"; 
}}); 
initContext.rebind("java:comp/UserTransaction", atomikosUserTransactionFactoryDS); 

Was ich bin mir nicht sicher, ob ich eine andere Lookup hinzufügen muß, und so eine neue Usertransaction aus der Fabrik holen, bevor eine neue UserTransaction beginnen?

Ich glaube nicht, dass es relevant ist, aber wie die Ressource Definition angibt, verwende ich Atomikos als meine Transaction Manager (und so ist es Fabrik als die Fabrik).

Danke,
Ittai

+0

Eine Aktion sollte nur eine Sache tun. Warum machst du mehrere Dinge, wie zum Beispiel mehrere Transaktionen innerhalb eines Anrufs anzurufen? –

+0

Das tatsächliche Szenario ist ein bisschen anders: Es ist mehr eine Weile (wahr) Schleife, wo innerhalb des Threads auf eine Datei wartet und wenn es einen findet es ut.begin, ut.commit verwendet. Am Ende jeder solchen Iteration schläft der Thread und so übertrage ich die Transaktion vor dem Schlaf und wenn sie erwacht, wenn es eine Datei gibt, dann gibt es eine neue logische Transaktion. Natürlich könnten Sie den Code einfach umformatieren, sobald eine Datei gefunden wurde, zu einer anderen Methode, die die ut ergreift und die Logik übernimmt und festlegt, aber das aktuelle Design ist nicht meins und ich wollte nur verifizieren, dass das nicht inkorrekt ist. Danke für deinen Kommentar. – Ittai

Antwort

3

Wiederverwendung ist ok.

UserTransaction stellt keine bestimmte Transaktionsinstanz dar, sondern bietet eine Möglichkeit, den Transaktionskontext des aktuellen Threads zu verwalten. Betrachten Sie es als Singleton, wenn Sie möchten. UserTransaction ist normalerweise zustandslos.

Eine einzelne Instanz einer Transaktion ist eine eigenständige Entität und wird normalerweise nicht direkt vom Benutzercode benötigt. Eins wird für jeden Sender erstellt und kann nicht wiederverwendet werden.

Wenn Sie eine Person im Winterschlaf sind, dann denken Sie in Bezug auf SessionFactory und Session.

Verwandte Themen