接続は、分散トランザクションをサポートするかどうかを設定できる DataSource を介して取得されます。分散トランザクションで複数の接続を使用するには、XA をサポートし、XA 接続を返すように複数の DataSource を構成する必要があります。
とは言っても、別のデータベースに接続する場合にのみ、いくつかの物理接続が必要ですが、これはあなたの場合ではないようです(質問では明確ではありません)。
DataSource は、同じスレッドにいる限り、同じ物理接続が使用されることを確認するのに十分スマートです。接続を要求するたびに、実際には同じ物理接続に「ハンドル」が返され、すべてのハンドルが閉じられると物理接続がプールに返されます。(ただし、それは DataSource の実装に依存します)。
Hibernate自体は XA リソースではありません。DataSource を介して取得した接続を基盤として使用します。しかし、特に、分散トランザクションがコミットされる前に、保留中のすべての変更をフラッシュするために、JTA を介してトランザクション マネージャーにフックされます。
ほとんどの場合、実装固有の API を使用して使用される基になる接続を取得できEntityManager
ます (少なくとも Hibernate では可能です)。これは、JTA と XA をまったく使用せずに要件を満たすことができることを意味します。JDBC の基になる接続を使用しEntityManager
ます。
要約すれば:
- XAResource をいじる必要はありません
- InnoDB に切り替える
- XA DataSource に切り替えて、接続を取得することができます
DataSource.getConnection()
- XA DataSource に切り替えて、基礎となる
EntityManager
接続を取得することができます
- XA 以外の DataSource を使用して、基礎となる
EntityManager
接続を取得することができます
あなたの質問を正しく理解し、それが役立つことを願っています。