3

分散トランザクション用に構成された既存のプロジェクトに取り組んでいます。

プロジェクトは Hibernate を使用していますが、いくつかの歴史的な理由から、私が取り組んでいる部分は JDBC を使用しており、そのままにしておく必要があります。

接続を取得するには、休止状態セッションの JDBC 接続を返す API を呼び出す必要があります。

1 つのトランザクションでいくつかの更新/挿入をまとめる必要があるため、ここで私がやっていることは次のとおりです。

  1. 接続で autoCommit を false に設定します。
  2. 挿入を行います (ステートメントの準備、クエリの実行)
  3. コミットを呼び出します。

コミット時に SQLException が発生します。これは、明らかに分散トランザクションでコミット/ロールバックを明示的に呼び出すことが許可されていないためです。データソース構成を非 XA に変更することはオプションではありません。

これを回避する方法はありますか?

        connexionDiff.setAutoCommit(false); 
        psInsertLiv = connexionDiff.prepareStatement(reqInsertLivraison);
        psInsertLivHisto = connexionDiff.prepareStatement(reqInsertLivraisonHisto);
        psSequence = connexionDiff.prepareStatement(reqCleLivraison);

        ps = connexionDiff.prepareStatement(requeteRelivraison);
        rs = ps.executeQuery();

        while(rs.next()) {

            rsSequence = psSequence.executeQuery();
            while ( rsSequence.next() ) {
                sequenceLivraison = rsSequence.getInt(1);
            }

            psInsertLiv.setInt(1, sequenceLivraison);
            psInsertLiv.setInt(2, rs.getInt(1));
            psInsertLiv.executeUpdate();

            psInsertLivHisto.setInt(1, sequenceLivraison);
            psInsertLivHisto.setInt(2, rs.getInt(1));
            psInsertLivHisto.executeUpdate();

            connexionDiff.commit();
        }

    } catch (SQLException ex) {
       try{
        connexionDiff.rollback();
      }catch {
//......
}
    } finally {
        //.....
    }

どうも

4

1 に答える 1

3

XA接続を使用しているため、JTAを使用してトランザクションを管理していることは確かです。

スタンドアロンのJTAの場合は、UserTransactionを取得し、beginを呼び出してそこでコミットします。アプリケーションサーバー内にある場合は、トランザクションアノテーションまたはアプリサーバーから提供されるものを使用してトランザクションを管理します。このページを見て、JavaEE6でどのように行われるかを理解してください。

Springを使用している場合は、トランザクションアノテーションを使用してコードをトランザクション内にラップすることもできます。関連するドキュメントは次のとおりです

トランザクション管理は、HibernateまたはプレーンJDBCのどちらを使用していても同じである必要があります。したがって、プロジェクトでHibernateを使用しているときにどのように実行されるかを確認し、同じ手順に従います。

于 2013-01-04T14:06:03.967 に答える