1

解決したい問題のコンテキスト: 外部システムとの通信を監査する Java spring http インターセプター AuditHttpCommunicationInterceptor があります。通信を行う HttpClieant は、DoBusinessLogicSevice と呼ばれるビジネス ロジックを実行する Java サービス クラスで使用されます。DoBusinessLogicSevice は新しいトランザクションを開き、いくつかの共同作業者を使用して多くのことを行います。

解決すべき問題: DoBusinessLogicSevice での操作の結果 (予期しない例外など) に関係なく、AuditHttpCommunicationInterceptor によって監査をデータベースに保存したいと考えています。

私が使用した解決策: AuditHttpCommunicationInterceptor は、次の方法で新しいトランザクションを開きます。

    TransactionDefinition transactionDefinition = new DefaultTransactionDefinition(TransactionDefinition.PROPAGATION_REQUIRES_NEW);
    new TransactionTemplate(platformTransactionManager, transactionDefinition).execute(new TransactionCallbackWithoutResult() {
        @Override
        protected void doInTransactionWithoutResult(TransactionStatus status) {
            // do stuff
        }
    });

すべて正常に動作します。DoBusinessLogicSevice の一部が予期しない例外をスローすると、そのトランザクションはロールバックされますが、AuditHttpCommunicationInterceptor は監査をデータベースに保存します。

このソリューションから生じる問題: AuditHttpCommunicationInterceptor は新しいデータベース接続を使用します。したがって、DoBusinessLogicSevice 呼び出しごとに 2 つのデータベース接続が必要です。基本的に、問題の解決策を知りたい: TransactionTemplate を現在のトランザクションを「一時停止」し、この場合、新しいトランザクションの接続を再利用する方法。

何か案は?:)

PS Oneのアイデアは、別の設計アプローチを取ることかもしれません.インターセプターをドロップし、DoBusinessLogicSeviceで直接使用されるAuditingHttpClientを作成します(Springによって呼び出されません)が、そこにあるすべてのhttpフィールドにアクセスできないため、それを行うことはできません.

4

1 に答える 1

2

Springはネストされたトランザクション(propagation = "NESTED")をサポートしていますが、これは実際にはデータベースプラットフォームに依存しており、すべてのデータベースプラットフォームがネストされたトランザクションを処理できるとは思いません。

プールから接続を取得し、迅速な監査トランザクションを実行し、接続を元に戻すことで何が重要かはわかりません。

更新: Springはネストされたトランザクションをサポートしていますが、Hibernateはサポートしていないようです。その場合、私は言います:監査のために別の接続を使用します。

于 2012-06-07T13:32:59.477 に答える