public class IsolationLevelDataSourceRouter extends AbstractRoutingDataSource
TransactionDefinition interface
で定義されているように、ターゲット DataSources は、分離レベル名をキーとして構成する必要があります。 これは、JTA トランザクション管理と組み合わせて(特に Spring の JtaTransactionManager
を介して)特に役立ちます。標準 JTA は、トランザクション固有の分離レベルをサポートしていません。一部の JTA プロバイダーは、ベンダー固有の拡張機能(WebLogic など)として分離レベルをサポートしています。これは、これに対処するための推奨される方法です。別の方法として(WebSphere など)、ターゲットデータベースは、それぞれが(DataSource 全体に対して)異なる分離レベルで構成された複数の JNDI DataSources を介して表すことができます。現在の DataSource ルーターでは、現在のトランザクションの分離レベルに基づいて、適切な DataSource に透過的に切り替えることができます。
たとえば、ターゲット DataSources が "myRepeatableReadDataSource"、"mySerializableDataSource"、および "myDefaultDataSource" という名前の個別の Spring Bean として定義されていると仮定すると、構成は次のようになります。
<bean id="dataSourceRouter" class="org.springframework.jdbc.datasource.lookup.IsolationLevelDataSourceRouter"> <property name="targetDataSources"> <map> <entry key="ISOLATION_REPEATABLE_READ" value-ref="myRepeatableReadDataSource"/> <entry key="ISOLATION_SERIALIZABLE" value-ref="mySerializableDataSource"/> </map> </property> <property name="defaultTargetDataSource" ref="myDefaultDataSource"/> </bean>または、キー設定された値は、
DataSourceLookup
を介して解決されるデータソース名にすることもできます。デフォルトでは、標準の JNDI ルックアップの JNDI 名です。これにより、個別の DataSource Bean 定義を必要とせずに、単一の簡潔な定義が可能になります。<bean id="dataSourceRouter" class="org.springframework.jdbc.datasource.lookup.IsolationLevelDataSourceRouter"> <property name="targetDataSources"> <map> <entry key="ISOLATION_REPEATABLE_READ" value="java:comp/env/jdbc/myrrds"/> <entry key="ISOLATION_SERIALIZABLE" value="java:comp/env/jdbc/myserds"/> </map> </property> <property name="defaultTargetDataSource" value="java:comp/env/jdbc/mydefds"/> </bean>メモ: このルーターを Spring の
JtaTransactionManager
と組み合わせて使用している場合は、"allowCustomIsolationLevels" フラグを "true" に切り替えることを忘れないでください。(標準の JTA 自体には分離レベルのサポートがないため、デフォルトでは、JtaTransactionManager はデフォルトの分離レベルのみを受け入れます。)<bean id="transactionManager" class="org.springframework.transaction.jta.JtaTransactionManager"> <property name="allowCustomIsolationLevels" value="true"/> </bean>
AbstractRoutingDataSource.setTargetDataSources(java.util.Map<java.lang.Object, java.lang.Object>)
, AbstractRoutingDataSource.setDefaultTargetDataSource(java.lang.Object)
, TransactionDefinition.ISOLATION_READ_UNCOMMITTED
, TransactionDefinition.ISOLATION_READ_COMMITTED
, TransactionDefinition.ISOLATION_REPEATABLE_READ
, TransactionDefinition.ISOLATION_SERIALIZABLE
, JtaTransactionManager
logger
コンストラクターと説明 |
---|
IsolationLevelDataSourceRouter() |
修飾子と型 | メソッドと説明 |
---|---|
protected java.lang.Object | determineCurrentLookupKey() 現在の検索キーを決定します。 |
protected java.lang.Object | resolveSpecifiedLookupKey(java.lang.Object lookupKey) TransactionDefinition interface で定義されている分離レベル名のほか、分離レベル定数の整数値をサポートします。 |
afterPropertiesSet, determineTargetDataSource, getConnection, getConnection, isWrapperFor, resolveSpecifiedDataSource, setDataSourceLookup, setDefaultTargetDataSource, setLenientFallback, setTargetDataSources, unwrap
getLoginTimeout, getLogWriter, getParentLogger, setLoginTimeout, setLogWriter
protected java.lang.Object resolveSpecifiedLookupKey(java.lang.Object lookupKey)
TransactionDefinition interface
で定義されている分離レベル名のほか、分離レベル定数の整数値をサポートします。AbstractRoutingDataSource
の resolveSpecifiedLookupKey
lookupKey
- ユーザーが指定したルックアップキーオブジェクト @Nullable protected java.lang.Object determineCurrentLookupKey()
AbstractRoutingDataSource
任意のキーを許可します。返されるキーは、AbstractRoutingDataSource.resolveSpecifiedLookupKey(java.lang.Object)
メソッドによって解決されるように、保存されているルックアップキー型と一致する必要があります。
AbstractRoutingDataSource
の determineCurrentLookupKey