3

データストアと残りのデータ用の別のデータベースで Jackrabbit を使用しています。Jackrabbit JCA を JBoss 7.1.1 にデプロイしました。アプリケーションをデバッグしたところ、セッション インスタンスのタイプがXASessionImpl.

現在、次のようなセッションを取得しています。

    final Credentials credentials = new SimpleCredentials("admin", "admin".toCharArray());

    try {
        final Session session = repository.login(credentials);
        return session;
    } catch (RepositoryException e) {
        throw new RuntimeException(e);
    }

アクセスするたびに呼び出しsession.save();て、完了したら呼び出します。session.logout()グローバル トランザクションの一部である場合、これは正しいですか。私は分散トランザクションなどについてあまり知識がないので、間違っていたら訂正してください。(Spring 3.2 を使用して)で注釈が付けられたメソッドの 1 つ内で実行時例外をスローしようとしました@Transactionalが、データストア内のデータは削除されません。これは正しいです?トランザクションがロールバックされた場合、データ ストアに追加されているデータは削除されませんか? これに対する私の「テスト」環境は、Jackrabbit にコンテンツを追加し、次にデータベースに追加し、実行時例外をスローすることでした。または、Jackrabbit が正しく構成されていませんか?

4

1 に答える 1

0

Jackrabbit は、Spring 管理のトランザクションがロールバックされてもデータストアのコンテンツが残っていると仮定して、おそらく独自のトランザクションを実行しています。Spring/JBoss リソースの構成はどのようになっていますか?

いくつかの簡単なグーグル検索 (キーワード JTA Jackrabbit Spring JBoss を使用) により、Jackrabbit と XA JDBC DataSource を使用して XA トランザクションをセットアップすることは、言うよりも簡単であることがわかります。古いメーリング リスト エントリでは、Jencks と呼ばれる JTA トランザクション マネージャを使用してこれを行うことができると報告されていますが、Jencks の開発は中止されたようです。

また、この JBoss コミュニティ wiki ページのセクション 1.2.3 を参照してください (多少の情報はありますが)、「jackrabbit は内部で XA プロトコルを実装しており、その下に非 XA データソースが必要です」と記載されています。見る。

また、XA のオプションとして、次のように XA をエミュレートすることを検討しましたか (疑似コードに注意してください)?:

@Transactional
public void addContent() {
    try {
        storeContentInJcrRepo();
        saveMetadataInDatabase();
    catch (DataAccessException e) {
        deleteNewlyStoredContentFromJcrRepo();
        // Rethrow to ensure DB transaction is rolled back
        throw e;
    }
}
于 2013-09-11T18:50:55.827 に答える