spring-framework / org.springframework.jdbc.datasource / LazyConnectionDataSourceProxy

LazyConnectionDataSourceProxy

open class LazyConnectionDataSourceProxy : DelegatingDataSource

Proxy for a target DataSource, fetching actual JDBC Connections lazily, i.e. not until first creation of a Statement. Connection initialization properties like auto-commit mode, transaction isolation and read-only mode will be kept and applied to the actual JDBC Connection as soon as an actual Connection is fetched (if ever). Consequently, commit and rollback calls will be ignored if no Statements have been created.

This DataSource proxy allows to avoid fetching JDBC Connections from a pool unless actually necessary. JDBC transaction control can happen without fetching a Connection from the pool or communicating with the database; this will be done lazily on first creation of a JDBC Statement.

If you configure both a LazyConnectionDataSourceProxy and a TransactionAwareDataSourceProxy, make sure that the latter is the outermost DataSource. In such a scenario, data access code will talk to the transaction-aware DataSource, which will in turn work with the LazyConnectionDataSourceProxy.

Lazy fetching of physical JDBC Connections is particularly beneficial in a generic transaction demarcation environment. It allows you to demarcate transactions on all methods that could potentially perform data access, without paying a performance penalty if no actual data access happens.

This DataSource proxy gives you behavior analogous to JTA and a transactional JNDI DataSource (as provided by the Java EE server), even with a local transaction strategy like DataSourceTransactionManager or HibernateTransactionManager. It does not add value with Spring's JtaTransactionManager as transaction strategy.

Lazy fetching of JDBC Connections is also recommended for read-only operations with Hibernate, in particular if the chances of resolving the result in the second-level cache are high. This avoids the need to communicate with the database at all for such read-only operations. You will get the same effect with non-transactional reads, but lazy fetching of JDBC Connections allows you to still perform reads in transactions.

NOTE: This DataSource proxy needs to return wrapped Connections (which implement the ConnectionProxy interface) in order to handle lazy fetching of an actual JDBC Connection. Use Connection#unwrap to retrieve the native JDBC Connection.

Author
Juergen Hoeller

Since
1.1.4

See Also
DataSourceTransactionManager

Constructors

<init>

LazyConnectionDataSourceProxy()
LazyConnectionDataSourceProxy(targetDataSource: DataSource)

Create a new LazyConnectionDataSourceProxy.

Functions

afterPropertiesSet

open fun afterPropertiesSet(): Unit

getConnection

open fun getConnection(): Connection
open fun getConnection(username: String, password: String): Connection

Return a Connection handle that lazily fetches an actual JDBC Connection when asked for a Statement (or PreparedStatement or CallableStatement).

The returned Connection handle implements the ConnectionProxy interface, allowing to retrieve the underlying target Connection.

setDefaultAutoCommit

open fun setDefaultAutoCommit(defaultAutoCommit: Boolean): Unit

Set the default auto-commit mode to expose when no target Connection has been fetched yet (-> actual JDBC Connection default not known yet).

If not specified, the default gets determined by checking a target Connection on startup. If that check fails, the default will be determined lazily on first access of a Connection.

setDefaultTransactionIsolation

open fun setDefaultTransactionIsolation(defaultTransactionIsolation: Int): Unit

Set the default transaction isolation level to expose when no target Connection has been fetched yet (-> actual JDBC Connection default not known yet).

This property accepts the int constant value (e.g. 8) as defined in the java.sql.Connection interface; it is mainly intended for programmatic use. Consider using the "defaultTransactionIsolationName" property for setting the value by name (e.g. "TRANSACTION_SERIALIZABLE").

If not specified, the default gets determined by checking a target Connection on startup. If that check fails, the default will be determined lazily on first access of a Connection.

setDefaultTransactionIsolationName

open fun setDefaultTransactionIsolationName(constantName: String): Unit

Set the default transaction isolation level by the name of the corresponding constant in java.sql.Connection, e.g. "TRANSACTION_SERIALIZABLE".