クラス LazyConnectionDataSourceProxy
- 実装済みのインターフェース一覧:
WrapperSE, CommonDataSourceSE, DataSourceSE, InitializingBean
プロパティが設定されると、対応する getter メソッドは、実際の接続が取得されるまで設定された値を返します。プロパティが設定されていない場合は、getter を呼び出すことで、デフォルト値を取得するために実際の接続が取得されます。
クライアント情報は上記の遅延プロパティに含まれていますが、以下のメソッドは遅延取得動作の例外であり、基となる接続を即座に取得します。Connection.getClientInfo() メソッドと Connection.getClientInfo(java.lang.String)SE メソッドは読み取り操作であり、その値はドライバのデフォルト設定、プールされた接続の残骸、外部セッションの変更により、確実にキャッシュすることができません。
Connection.setClientInfo(java.util.Properties)SE メソッドは、即時取得を強制します。JDBC ドライバの実装は一貫性がなく、上書きとして扱うものもあれば、追加 / マージとして扱うものもあります。すべてのドライバで非遅延 DataSource と同じ動作を保証するために、プロキシはキャッシュやリプレイを行わず、意味の不一致のリスクを回避します。
6.1.2 以降では、通常のターゲットである DataSource に加えて、読み取り専用トランザクション中に使用する read-only DataSource に対する特別なサポートも提供されています。
この DataSource プロキシを使用すると、実際に必要な場合を除き、プールから JDBC 接続をフェッチする必要がなくなります。JDBC トランザクション制御は、プールから接続をフェッチしたり、データベースと通信したりせずに実行できます。これは、JDBC ステートメントの最初の作成時に遅延実行されます。さらに、これにより、ルーティング DataSource (たとえば、IsolationLevelDataSourceRouter) でトランザクション同期読み取り専用フラグや分離レベルを考慮に入れることができます。
LazyConnectionDataSourceProxy と TransactionAwareDataSourceProxy の両方を構成する場合は、後者が最も外側の DataSource であることを確認してください。このようなシナリオでは、データアクセスコードはトランザクション対応の DataSource と通信し、次に LazyConnectionDataSourceProxy と連携します。6.1.2 以降、LazyConnectionDataSourceProxy は最初の接続アクセス時にデフォルトの接続特性を初期化します。起動時にこれを強制するには、checkDefaultConnectionProperties() を呼び出します。
物理 JDBC 接続の遅延フェッチは、一般的なトランザクション境界環境で特に役立ちます。これにより、実際のデータアクセスが発生しない場合にパフォーマンスを犠牲にすることなく、データアクセスを実行する可能性のあるすべてのメソッドでトランザクションを区別できます。
この DataSource プロキシは、DataSourceTransactionManager や HibernateTransactionManager などのローカルトランザクション戦略を使用しても、JTA およびトランザクション JNDI DataSource(Jakarta EE サーバーによって提供される)に類似した動作を提供します。トランザクション戦略として Spring の JtaTransactionManager を使用しても、付加価値はありません。
特に二次キャッシュで結果を解決する可能性が高い場合、Hibernate での読み取り専用操作の場合、JDBC 接続の遅延フェッチもお勧めします。これにより、このような読み取り専用操作でデータベースと通信する必要がまったくなくなります。非トランザクション読み取りでも同じ効果が得られますが、JDBC 接続の遅延フェッチにより、トランザクションで読み取りを実行できます。
6.2.6 以降、この DataSource プロキシは、その間に接続が閉じられてタイムアウトになった場合のロールバック試行も抑制します。
注意 : この DataSource プロキシは、実際の JDBC 接続の遅延フェッチを処理するために、(ConnectionProxy インターフェースを実装する)ラップされた接続を返す必要があります。Wrapper.unwrap(Class)SE を使用してネイティブ JDBC 接続を取得します。
- 導入:
- 1.1.4
- 作成者:
- Juergen Hoeller, Sam Brannen, Chengang Guan
- 関連事項:
コンストラクター概要
コンストラクターコンストラクター説明新しい LazyConnectionDataSourceProxy を作成します。LazyConnectionDataSourceProxy(DataSourceSE targetDataSource) 新しい LazyConnectionDataSourceProxy を作成します。方法の概要
修飾子と型メソッド説明void可能であれば、ターゲット DataSource からの接続を介してデフォルトの自動コミットとトランザクション分離を決定します。protected voidデフォルトの接続プロパティ (自動コミット、トランザクション分離) を確認し、後でターゲット DataSource から実際の JDBC 接続をフェッチしなくても正しく公開できるように維持します。デフォルトの自動コミット値を公開します。デフォルトのトランザクション分離値を公開します。ステートメント(または PreparedStatement または CallableStatement)を要求されたときに実際の JDBC 接続を遅延フェッチする接続ハンドルを返します。getConnection(StringSE username, StringSE password) ステートメント(または PreparedStatement または CallableStatement)を要求されたときに実際の JDBC 接続を遅延フェッチする接続ハンドルを返します。voidsetDefaultAutoCommit(boolean defaultAutoCommit) ターゲット接続がまだフェッチされていない場合(実際の JDBC 接続のデフォルトがまだ不明な場合)に公開するように、デフォルトの自動コミットモードを設定します。voidsetDefaultTransactionIsolation(int defaultTransactionIsolation) ターゲット接続がまだフェッチされていない場合(実際の JDBC 接続のデフォルトがまだ不明な場合)に公開するデフォルトのトランザクション分離レベルを設定します。voidsetDefaultTransactionIsolationName(StringSE constantName) ConnectionSE の対応する定数の名前によってデフォルトのトランザクション分離レベルを設定します。たとえば、"TRANSACTION_SERIALIZABLE"。voidsetReadOnlyDataSource(@Nullable DataSourceSE readOnlyDataSource) 読み取り専用トランザクションに使用するターゲット DataSource のバリアントを指定します。
コンストラクターの詳細
LazyConnectionDataSourceProxy
public LazyConnectionDataSourceProxy()新しい LazyConnectionDataSourceProxy を作成します。- 関連事項:
LazyConnectionDataSourceProxy
新しい LazyConnectionDataSourceProxy を作成します。- パラメーター:
targetDataSource- ターゲット DataSource- 関連事項:
方法の詳細
setReadOnlyDataSource
読み取り専用トランザクションに使用するターゲット DataSource のバリアントを指定します。利用可能な場合、このような読み取り専用 DataSource からの接続は、読み取り専用としてマークされている Spring 管理のトランザクション内で遅延取得されます。
Connection.setReadOnly(boolean)SE フラグは変更されず、読み取り専用 DataSource のデフォルトとして事前設定されることが期待され、各トランザクションの開始時と終了時にフラグを切り替えるオーバーヘッドが回避されます。また、デフォルトの自動コミットおよび分離レベル設定は、プライマリターゲット DataSource のデフォルトの接続プロパティと一致することが期待されます。- 導入:
- 6.1.2
- 関連事項:
setDefaultAutoCommit
public void setDefaultAutoCommit(boolean defaultAutoCommit) ターゲット接続がまだフェッチされていない場合(実際の JDBC 接続のデフォルトがまだ不明な場合)に公開するように、デフォルトの自動コミットモードを設定します。指定しない場合、デフォルトは接続の最初のアクセスを遅延チェックすることによって決定されます。
- 関連事項:
setDefaultTransactionIsolationName
ConnectionSE の対応する定数の名前によってデフォルトのトランザクション分離レベルを設定します。たとえば、"TRANSACTION_SERIALIZABLE"。- パラメーター:
constantName- 定数の名前- 関連事項:
setDefaultTransactionIsolation
public void setDefaultTransactionIsolation(int defaultTransactionIsolation) ターゲット接続がまだフェッチされていない場合(実際の JDBC 接続のデフォルトがまだ不明な場合)に公開するデフォルトのトランザクション分離レベルを設定します。このプロパティは、
ConnectionSE インターフェースで定義されている int 定数値 (たとえば、8) を受け入れます。これは主にプログラムによる使用を目的としています。名前 (たとえば、"TRANSACTION_SERIALIZABLE") で値を設定するには、"defaultTransactionIsolationName" プロパティの使用を検討してください。指定しない場合、デフォルトは接続の最初のアクセスを遅延チェックすることによって決定されます。
- 関連事項:
checkDefaultConnectionProperties
public void checkDefaultConnectionProperties()可能であれば、ターゲット DataSource からの接続を介してデフォルトの自動コミットとトランザクション分離を決定します。- 導入:
- 6.1.2
- 関連事項:
checkDefaultConnectionProperties
デフォルトの接続プロパティ (自動コミット、トランザクション分離) を確認し、後でターゲット DataSource から実際の JDBC 接続をフェッチしなくても正しく公開できるように維持します。- パラメーター:
con- チェックに使用する接続- 例外:
SQLExceptionSE- Connection メソッドによってスローされた場合
defaultAutoCommit
defaultTransactionIsolation
getConnection
ステートメント(または PreparedStatement または CallableStatement)を要求されたときに実際の JDBC 接続を遅延フェッチする接続ハンドルを返します。返された Connection ハンドルは ConnectionProxy インターフェースを実装し、基になるターゲット Connection を取得できるようにします。
- 次で指定:
- インターフェース
DataSourceSE内のgetConnection - オーバーライド:
- クラス
DelegatingDataSourceのgetConnection - 戻り値:
- 遅延接続ハンドル
- 例外:
SQLExceptionSE- 関連事項:
getConnection
ステートメント(または PreparedStatement または CallableStatement)を要求されたときに実際の JDBC 接続を遅延フェッチする接続ハンドルを返します。返された Connection ハンドルは ConnectionProxy インターフェースを実装し、基になるターゲット Connection を取得できるようにします。
- 次で指定:
- インターフェース
DataSourceSE内のgetConnectionSE - オーバーライド:
- クラス
DelegatingDataSourceのgetConnection - パラメーター:
username- 接続ごとのユーザー名password- 接続ごとのパスワード- 戻り値:
- 遅延接続ハンドル
- 例外:
SQLExceptionSE- 関連事項: