org.springframework.jdbc.datasource
Class IsolationLevelDataSourceAdapter

java.lang.Object
  extended by org.springframework.jdbc.datasource.DelegatingDataSource
      extended by org.springframework.jdbc.datasource.UserCredentialsDataSourceAdapter
          extended by org.springframework.jdbc.datasource.IsolationLevelDataSourceAdapter
All Implemented Interfaces:
java.sql.Wrapper, javax.sql.CommonDataSource, javax.sql.DataSource, InitializingBean
Direct Known Subclasses:
WebSphereDataSourceAdapter

public class IsolationLevelDataSourceAdapter
extends UserCredentialsDataSourceAdapter

An adapter for a target DataSource, applying the current Spring transaction's isolation level (and potentially specified user credentials) to every getConnection call. Also applies the read-only flag, if specified.

Can be used to proxy a target JNDI DataSource that does not have the desired isolation level (and user credentials) configured. Client code can work with this DataSource as usual, not worrying about such settings.

Inherits the capability to apply specific user credentials from its superclass UserCredentialsDataSourceAdapter; see the latter's javadoc for details on that functionality (e.g. UserCredentialsDataSourceAdapter.setCredentialsForCurrentThread(java.lang.String, java.lang.String)).

WARNING: This adapter simply calls Connection.setTransactionIsolation(int) and/or Connection.setReadOnly(boolean) for every Connection obtained from it. It does, however, not reset those settings; it rather expects the target DataSource to perform such resetting as part of its connection pool handling. Make sure that the target DataSource properly cleans up such transaction state.

Since:
2.0.3
Author:
Juergen Hoeller
See Also:
setIsolationLevel(int), setIsolationLevelName(java.lang.String), UserCredentialsDataSourceAdapter.setUsername(java.lang.String), UserCredentialsDataSourceAdapter.setPassword(java.lang.String)

Field Summary
private static Constants constants
          Constants instance for TransactionDefinition
private  java.lang.Integer isolationLevel
           
 
Constructor Summary
IsolationLevelDataSourceAdapter()
           
 
Method Summary
protected  java.sql.Connection doGetConnection(java.lang.String username, java.lang.String password)
          Applies the current isolation level value and read-only flag to the returned Connection.
protected  java.lang.Integer getCurrentIsolationLevel()
          Determine the current isolation level: either the transaction's isolation level or a statically defined isolation level.
protected  java.lang.Boolean getCurrentReadOnlyFlag()
          Determine the current read-only flag: by default, the transaction's read-only hint.
protected  java.lang.Integer getIsolationLevel()
          Return the statically specified isolation level, or null if none.
 void setIsolationLevel(int isolationLevel)
          Specify the default isolation level to use for Connection retrieval, according to the JDBC Connection constants (equivalent to the corresponding Spring TransactionDefinition constants).
 void setIsolationLevelName(java.lang.String constantName)
          Set the default isolation level by the name of the corresponding constant in TransactionDefinition, e.g.
 
Methods inherited from class org.springframework.jdbc.datasource.UserCredentialsDataSourceAdapter
getConnection, getConnection, removeCredentialsFromCurrentThread, setCredentialsForCurrentThread, setPassword, setUsername
 
Methods inherited from class org.springframework.jdbc.datasource.DelegatingDataSource
afterPropertiesSet, getLoginTimeout, getLogWriter, getTargetDataSource, isWrapperFor, setLoginTimeout, setLogWriter, setTargetDataSource, unwrap
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

constants

private static final Constants constants
Constants instance for TransactionDefinition


isolationLevel

private java.lang.Integer isolationLevel
Constructor Detail

IsolationLevelDataSourceAdapter

public IsolationLevelDataSourceAdapter()
Method Detail

setIsolationLevelName

public final void setIsolationLevelName(java.lang.String constantName)
                                 throws java.lang.IllegalArgumentException
Set the default isolation level by the name of the corresponding constant in TransactionDefinition, e.g. "ISOLATION_SERIALIZABLE".

If not specified, the target DataSource's default will be used. Note that a transaction-specific isolation value will always override any isolation setting specified at the DataSource level.

Parameters:
constantName - name of the constant
Throws:
java.lang.IllegalArgumentException
See Also:
TransactionDefinition.ISOLATION_READ_UNCOMMITTED, TransactionDefinition.ISOLATION_READ_COMMITTED, TransactionDefinition.ISOLATION_REPEATABLE_READ, TransactionDefinition.ISOLATION_SERIALIZABLE, setIsolationLevel(int)

setIsolationLevel

public void setIsolationLevel(int isolationLevel)
Specify the default isolation level to use for Connection retrieval, according to the JDBC Connection constants (equivalent to the corresponding Spring TransactionDefinition constants).

If not specified, the target DataSource's default will be used. Note that a transaction-specific isolation value will always override any isolation setting specified at the DataSource level.

See Also:
Connection.TRANSACTION_READ_UNCOMMITTED, Connection.TRANSACTION_READ_COMMITTED, Connection.TRANSACTION_REPEATABLE_READ, Connection.TRANSACTION_SERIALIZABLE, TransactionDefinition.ISOLATION_READ_UNCOMMITTED, TransactionDefinition.ISOLATION_READ_COMMITTED, TransactionDefinition.ISOLATION_REPEATABLE_READ, TransactionDefinition.ISOLATION_SERIALIZABLE, TransactionDefinition.getIsolationLevel(), TransactionSynchronizationManager.getCurrentTransactionIsolationLevel()

getIsolationLevel

protected java.lang.Integer getIsolationLevel()
Return the statically specified isolation level, or null if none.


doGetConnection

protected java.sql.Connection doGetConnection(java.lang.String username,
                                              java.lang.String password)
                                       throws java.sql.SQLException
Applies the current isolation level value and read-only flag to the returned Connection.

Overrides:
doGetConnection in class UserCredentialsDataSourceAdapter
Parameters:
username - the username to use
password - the password to use
Returns:
the Connection
Throws:
java.sql.SQLException
See Also:
getCurrentIsolationLevel(), getCurrentReadOnlyFlag()

getCurrentIsolationLevel

protected java.lang.Integer getCurrentIsolationLevel()
Determine the current isolation level: either the transaction's isolation level or a statically defined isolation level.

Returns:
the current isolation level, or null if none
See Also:
TransactionSynchronizationManager.getCurrentTransactionIsolationLevel(), setIsolationLevel(int)

getCurrentReadOnlyFlag

protected java.lang.Boolean getCurrentReadOnlyFlag()
Determine the current read-only flag: by default, the transaction's read-only hint.

Returns:
whether there is a read-only hint for the current scope
See Also:
TransactionSynchronizationManager.isCurrentTransactionReadOnly()