1

データベースへの 2 つのレベルのアクセスがあります。最初は Hibernate で、2 番目は JDBC で。JDBC レベルは非トランザクション テーブルで動作します (速度を上げるために MyISAM を使用しています)。トランザクション内で両方のレベルが機能するようにしたい。分散トランザクションを管理できる JTA について読みました。しかし、カスタム リソースの実装方法と使用方法に関する情報がインターネット上に不足しています。

カスタム XAResources を使用した経験のある人はいますか?

4

2 に答える 2

1

トランザクション内で両方のレベルが機能するようにしたい。

次に、ストレージ エンジンを InnoDB 用に変更する必要があります。MyISAM テーブルはトランザクションをサポートしていません (技術的には、エラーは発生しませんが、ロールバックは何もロールバックしません)。

カスタム XAResources を使用した経験のある人はいますか?

おっしゃっていることがよくわかりません。ここに表示される唯一の XA リソースはデータベースであり、カスタムのものを実装する必要はありません。必要なことは、おそらく 2 つの XA DataSource (MySQL Connector/J 5.0.0 以降でサポートされている) から取得された XA 接続を使用し、JTA API を使用して、Transaction Manager にジョブを実行させることです。

しかし、正直に言うと、要件を明確にする必要があります。XA を使用する以外の (そしてより簡単な) オプションがあるかもしれません。上記のすべてが中国語のように聞こえる場合は、ここでは XA を使用しないことをお勧めします。

于 2010-04-16T04:16:05.907 に答える
1

接続は、分散トランザクションをサポートするかどうかを設定できる DataSource を介して取得されます。分散トランザクションで複数の接続を使用するには、XA をサポートし、XA 接続を返すように複数の DataSource を構成する必要があります。

とは言っても、別のデータベースに接続する場合にのみ、いくつかの物理接続が必要ですが、これはあなたの場合ではないようです(質問では明確ではありません)。

DataSource は、同じスレッドにいる限り、同じ物理接続が使用されることを確認するのに十分スマートです。接続を要求するたびに、実際には同じ物理接続に「ハンドル」が返され、すべてのハンドルが閉じられると物理接続がプールに返されます。(ただし、それは DataSource の実装に依存します)。

Hibernate自体は XA リソースではありません。DataSource を介して取得した接続を基盤として使用します。しかし、特に、分散トランザクションがコミットされる前に、保留中のすべての変更をフラッシュするために、JTA を介してトランザクション マネージャーにフックされます。

ほとんどの場合、実装固有の API を使用して使用される基になる接続を取得できEntityManagerます (少なくとも Hibernate では可能です)。これは、JTA と XA をまったく使用せずに要件を満たすことができることを意味します。JDBC の基になる接続を使用しEntityManagerます。

要約すれば:

  1. XAResource をいじる必要はありません
  2. InnoDB に切り替える
  3. XA DataSource に切り替えて、接続を取得することができますDataSource.getConnection()
  4. XA DataSource に切り替えて、基礎となるEntityManager接続を取得することができます
  5. XA 以外の DataSource を使用して、基礎となるEntityManager接続を取得することができます

あなたの質問を正しく理解し、それが役立つことを願っています。

于 2010-04-16T08:27:33.550 に答える