2010-11-23 13 views
4


次のコードのutインスタンスの再利用は正しいですか?commit()の後にUserTransactionインスタンスを再利用することはできますか?

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(); 

JNDIリソースは、そのように定義されている場合:

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); 

私は、私は別の参照を追加する必要があり、そのため、工場から新しいのUserTransactionを取得するかどうかの前に、あるわからないんだけど新しいUserTransactionを開始しますか?

私はそれが関係ないと思いますが、リソース定義の状態として、私はトランザクションマネージャーとしてAtomikosを使用しています(そして、それは工場として工場です)。

おかげで、
Ittai

+0

アクションは、1つのものと1つのものだけを実行する必要があります。 1回のコールから複数のトランザクションを呼び出すなど、複数のことをやっているのはなぜですか? –

+0

実際のシナリオはちょっと違っています。スレッド内でファイルを待っているwhile(true)ループのほうが多く、ut.begin、ut.commitを使用しているファイルが見つかると、それはより多くのループです。そのような反復の終わりにスレッドはスリープ状態になるので、スリープの前にトランザクションをコミットし、ファイルがある場合には起動すると新しい論理トランザクションが発生します。もちろん、ファイルが見つかるとコードをリファクタリングして、utをつかんで論理とコミットを行う別の方法に変更できますが、現在のデザインは私のものではなく、これが間違っていないことを確認したいだけです。あなたのコメントをありがとう。 – Ittai

答えて

3

再利用はokです。

UserTransactionは特定のトランザクションインスタンスを表すのではなく、現在のスレッドのトランザクションコンテキストを管理する方法を提供します。もしあなたが好きなら、それをシングルトンと考えてください。 UserTransactionは通常はステートレスです。

トランザクションの個々のインスタンスは別個のエンティティであり、通常はユーザーコードによって直接必要とされません。 1つはtxごとに作成され、再利用することはできません。

あなたが休止状態の人なら、SessionFactoryとSessionの観点から考えるとよいでしょう。

関連する問題