2

現在、ローカルおよびリモートの EJB、MDB (シングルトンおよびステートレス) を備えた JavaEE アプリケーション サーバーで、Hibernate Core に JDBC-Transactions を使用しています。

休止状態のセッションとトランザクションの開始と終了、コミットをすべて自分で管理すると、接続リークやコミットされていないトランザクションが発生する可能性があります。
特に、キャッチされず、リモート クライアントにスローされないカスタムまたは未チェックの例外が発生するプログラミング エラーの場合。

エラーがスローされた場合に、休止状態のセッションが閉じられ、トランザクションがロールバックされたことを確認する最も簡単で最善の方法は何ですか?

コンテナー管理トランザクション (CMT) を使用しますか? または、EJB メソッドの戻り時に呼び出されるインターセプター内でセッションを閉じることは可能ですか?

簡単な方法の 1 つは、セッション スコープの使用法を try-catch ブロックでラップし、あらゆる種類の例外をキャッチすることですが、コードが少ない一般的なアプローチが好まれます。

編集: リモート EJB の例

  • 私の低レベルの Hibernate DAO は接続を閉じ、スローされた例外でトランザクションをロールバックします。問題は、接続がまだ開いている場合の DAO アクセス間のビジネス ロジックです。

    public void doSomething(Foo foo) throws Exception
    {
        // open session and transaction
        Session session = DAO.openSession();
    
        // retrieve data
        Bar bar = DAO.get(session, ...) 
    
        // call other methods which throws an exception resulting in open connection
        doOtherStuff(foo, bar)
    
        DAO.save(session, foo);
    
        // commit transaction
        DAO.closeAndCommitSession(session);
    }
    

今、私は大きなtry-catch-finallyを使用しています:

    public void doSomething(Foo foo) throws Exception
    {
        // open session and transaction
        Session session = DAO.openSession();
        try
        {
            // retrieve data
            Bar bar = DAO.get(session, ...) 

            // call other methods which throws an exception resulting in open connection
            doOtherStuff(foo, bar)

            DAO.save(session, foo);
        }
        catch (final Exception e)
        {
            DAO.rollBackTransaction(session);
            throw e;
        }
        finally
        {
            DAO.closeAndCommitSession(session);
        }
    }
4

1 に答える 1