2010-11-18 11 views
1

のは、(私はDAOとしてiBatisのを使用しています)私は私のプロジェクトで、次のような構造を持っているとしましょう:iBatisにネストされたトランザクションの問題を解決するには?

public class UsersManager { 
    public void do { 
     mySqlMapClient.startTransaction(); 
     // my code here 
     mySqlMapClient.endTransaction(); 
     mySqlMapClient.commitTransaction(); 
    } 
} 

public class StatsManager { 
    public void do { 
     mySqlMapClient.startTransaction(); 
     // my code here 
     mySqlMapClient.endTransaction(); 
     mySqlMapClient.commitTransaction(); 
    } 
} 

public class App { 
    public void do { 
     myUsersManager.do(); 
     myStatsManager.do(); // here I get an exception, because the transaction is already started 
    } 
} 

だから、私の質問は、どのように私はこの問題を解決することができますか?私は自分のプロジェクトに150以上のトランザクションを持っているので、すべてのビジネスロジックを書き直すのは簡単な解決策ではありません。このような状況には標準的なアプローチがありますか、どこで見ていますか?

答えて

3

まさにこのような理由から、DAO内にトランザクションロジックを持つべきではありません。

通常、データベース接続と作業ユニットを所有するサービス層があります。トランザクションを開始し、参加しているすべてのDAOを呼び出し、トランザクションが完了したらクリーンアップします。

Springフレームワークは、アスペクトを使用してトランザクションロジックを実装します。それらのすべてのDAOのためのインターフェイスを持っています。 Springは、トランザクションを宣言的に処理するプロキシを生成します。たとえあなたがSpringを使用していなくても、それらの設計コンセプトのいくつかを使うことができます。

春を学ぼう。それはiBatisをうまくサポートします。

+0

さて、私がやることは、春を学ぶことです。しかし、私はすでにDAOにトランザクションを入れている巨大な設計上の問題があることを考慮しました。 – Michael

+0

とにかく、ありがとうございました。 – Michael

+0

リファクタリングに値する可能性があります。トランザクションロジックが150クラスではなく1カ所にある場合、コードのサイズはどれくらい小さくなるか考えてみてください。これは、アスペクト指向のプログラミングがクロスカッティングに関する懸念のためにできることです。トランザクションは1つです。ロギングは別のものです。これをSpring iBatisに組み込むことは、それを実現させるほど難しくありません。 – duffymo

関連する問題