リソースとトランザクションの同期

さまざまなトランザクションマネージャーを作成する方法、およびトランザクションに同期する必要がある関連リソース(たとえば、DataSourceTransactionManager を JDBC DataSource に、HibernateTransactionManager を Hibernate SessionFactory などに)にリンクする方法が明確になりました。このセクションでは、アプリケーションコードが(JDBC、Hibernate、JPA などの永続 API を使用して直接的または間接的に)これらのリソースが適切に作成、再利用、クリーンアップされることを保証する方法について説明します。このセクションでは、関連する TransactionManager を介してトランザクション同期が(オプションで)トリガーされる方法についても説明します。

高レベルの同期アプローチ

推奨されるアプローチは、Spring の最高レベルのテンプレートベースの永続性統合 API を使用するか、ネイティブリソースファクトリを管理するためにトランザクション対応のファクトリ Bean またはプロキシでネイティブ ORMAPI を使用することです。これらのトランザクション対応ソリューションは、リソースの作成と再利用、クリーンアップ、リソースのオプションのトランザクション同期、例外マッピングを内部的に処理します。ユーザーデータアクセスコードはこれらのタスクに対処する必要はありませんが、ボイラープレート以外の永続性ロジックに純粋に焦点を当てることができます。通常、ネイティブ ORM API を使用するか、JdbcTemplate を使用して JDBC アクセス用のテンプレートアプローチを採用します。これらのソリューションについては、このリファレンスドキュメントの後続のセクションで詳しく説明します。

低レベル同期アプローチ

DataSourceUtils (JDBC の場合)、EntityManagerFactoryUtils (JPA の場合)、SessionFactoryUtils (Hibernate の場合)などのクラスが下位レベルに存在します。アプリケーションコードでネイティブ永続性 API のリソース型を直接処理する場合、これらのクラスを使用して、Spring フレームワークで管理された適切なインスタンスが取得され、トランザクションが(オプションで)同期され、プロセスで発生する例外が確実に発生するようにします。一貫性のある API に適切にマッピングされます。

例: JDBC の場合、DataSource で getConnection() メソッドを呼び出す従来の JDBC アプローチの代わりに、次のように Spring の org.springframework.jdbc.datasource.DataSourceUtils クラスを使用できます。

Connection conn = DataSourceUtils.getConnection(dataSource);

既存のトランザクションにすでに同期(リンク)された接続がある場合、そのインスタンスが返されます。それ以外の場合、メソッド呼び出しは、新しい接続の作成をトリガーします。この接続は、(オプションで)既存のトランザクションと同期され、同じトランザクションで後続の再利用が可能になります。前述のように、SQLException は Spring Framework CannotGetJdbcConnectionException にラップされます。これは、Spring Framework の未チェック DataAccessException 型階層の 1 つです。このアプローチは、SQLException から簡単に取得できるよりも多くの情報を提供し、データベース間、さらには異なる永続化テクノロジー間でも移植性を保証します。

このアプローチは、Spring トランザクション管理なしでも機能するため(トランザクション同期はオプションです)、トランザクション管理に Spring を使用するかどうかに関係なく使用できます。

もちろん、Spring の JDBC サポート、JPA サポート、Hibernate サポートを使用した後は、DataSourceUtils やその他のヘルパークラスを使用しない方が一般的です。これは、関連する API を直接使用するよりも Spring 抽象化を通じて作業する方がはるかに幸せです。例: Spring JdbcTemplate または jdbc.object パッケージを使用して JDBC の使用を簡素化する場合、バックグラウンドで正しい接続の取得が行われ、特別なコードを記述する必要はありません。

TransactionAwareDataSourceProxy

最下位レベルには TransactionAwareDataSourceProxy クラスが存在します。これは、ターゲット DataSource のプロキシであり、ターゲット DataSource をラップして、Spring 管理のトランザクションの認識を追加します。この点で、Jakarta EE サーバーによって提供されるトランザクション JNDI DataSource に似ています。

既存のコードを呼び出して標準 JDBC DataSource インターフェース実装を渡す必要がある場合を除き、このクラスを使用する必要はほとんどありません。その場合、このコードは使用可能ですが、Spring 管理のトランザクションに参加している可能性があります。前述の高レベルの抽象化を使用して、新しいコードを作成できます。