Package org.springframework.jdbc.datasource

# Class DataSourceUtils

java.lang.Object
org.springframework.jdbc.datasource.DataSourceUtils

public abstract class DataSourceUtils extends Object
Helper class that provides static methods for obtaining JDBC `Connection`s from a `DataSource`. Includes special support for Spring-managed transactional `Connection`s, for example, managed by `DataSourceTransactionManager` or `JtaTransactionManager`.

Used internally by Spring's `JdbcTemplate`, Spring's JDBC operation objects and the JDBC `DataSourceTransactionManager`. Can also be used directly in application code.

Author:
  Rod Johnson, Juergen Hoeller
See Also:
  - `getConnection(javax.sql.DataSource)`
  - `releaseConnection(java.sql.Connection, javax.sql.DataSource)`
  - `JdbcTemplate`
  - `JdbcTransactionManager`
  - `JtaTransactionManager`
  - `TransactionSynchronizationManager`

## Field Summary

Fields
Modifier and Type
Field
Description
`static final int`
`CONNECTION_SYNCHRONIZATION_ORDER`
Order value for TransactionSynchronization objects that clean up JDBC Connections.

## Constructor Summary

Constructors
Constructor
Description
`DataSourceUtils()`

## Method Summary

Modifier and Type
Method
Description
`static void`
`applyTimeout(Statement stmt, DataSource dataSource, int timeout)`
Apply the specified timeout - overridden by the current transaction timeout, if any - to the given JDBC Statement object.
`static void`
`applyTransactionTimeout(Statement stmt, DataSource dataSource)`
Apply the current transaction timeout, if any, to the given JDBC Statement object.
`static void`
`doCloseConnection(Connection con, DataSource dataSource)`
Close the Connection, unless a `SmartDataSource` doesn't want us to.
`static Connection`
`doGetConnection(DataSource dataSource)`
Actually obtain a JDBC Connection from the given DataSource.
`static void`
`doReleaseConnection(Connection con, DataSource dataSource)`
Actually close the given Connection, obtained from the given DataSource.
`static Connection`
`getConnection(DataSource dataSource)`
Obtain a Connection from the given DataSource.
`static Connection`
`getTargetConnection(Connection con)`
Return the innermost target Connection of the given Connection.
`static boolean`
`isConnectionTransactional(Connection con, DataSource dataSource)`
Determine whether the given JDBC Connection is transactional, that is, bound to the current thread by Spring's transaction facilities.
`static Integer`
`prepareConnectionForTransaction(Connection con, org.springframework.transaction.TransactionDefinition definition)`
Prepare the given Connection with the given transaction semantics.
`static void`
`releaseConnection(Connection con, DataSource dataSource)`
Close the given Connection, obtained from the given DataSource, if it is not managed externally (that is, not bound to the thread).
`static void`
`resetConnectionAfterTransaction(Connection con, Integer previousIsolationLevel)`
Deprecated.
as of 5.1.11, in favor of `resetConnectionAfterTransaction(Connection, Integer, boolean)`
`static void`
`resetConnectionAfterTransaction(Connection con, Integer previousIsolationLevel, boolean resetReadOnly)`
Reset the given Connection after a transaction, regarding read-only flag and isolation level.

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

## Field Details

### CONNECTION_SYNCHRONIZATION_ORDER

public static final int CONNECTION_SYNCHRONIZATION_ORDER
Order value for TransactionSynchronization objects that clean up JDBC Connections.

See Also:
  - Constant Field Values

## Constructor Details

### DataSourceUtils

public DataSourceUtils()

## Method Details

### getConnection

public static Connection getConnection(DataSource dataSource) throws CannotGetJdbcConnectionException
Obtain a Connection from the given DataSource. Translates SQLExceptions into the Spring hierarchy of unchecked generic data access exceptions, simplifying calling code and making any exception that is thrown more meaningful.

Is aware of a corresponding Connection bound to the current thread, for example when using `DataSourceTransactionManager`. Will bind a Connection to the thread if transaction synchronization is active, for example, when running within a `JTA` transaction).

Parameters:
  `dataSource` - the DataSource to obtain Connections from
Returns:
  a JDBC Connection from the given DataSource
Throws:
  `CannotGetJdbcConnectionException` - if the attempt to get a Connection failed
See Also:
  - `releaseConnection(Connection, DataSource)`
  - `isConnectionTransactional(Connection, DataSource)`

### doGetConnection

public static Connection doGetConnection(DataSource dataSource) throws SQLException
Actually obtain a JDBC Connection from the given DataSource. Same as `getConnection(javax.sql.DataSource)`, but throwing the original SQLException.

Is aware of a corresponding Connection bound to the current thread, for example when using `DataSourceTransactionManager`. Will bind a Connection to the thread if transaction synchronization is active (for example, if in a JTA transaction).

Directly accessed by `TransactionAwareDataSourceProxy`.

Parameters:
  `dataSource` - the DataSource to obtain Connections from
Returns:
  a JDBC Connection from the given DataSource
Throws:
  `SQLException` - if thrown by JDBC methods
See Also:
  - `doReleaseConnection(java.sql.Connection, javax.sql.DataSource)`

### prepareConnectionForTransaction

@Nullable public static Integer prepareConnectionForTransaction(Connection con, @Nullable org.springframework.transaction.TransactionDefinition definition) throws SQLException
Prepare the given Connection with the given transaction semantics.

Parameters:
  `con` - the Connection to prepare
  `definition` - the transaction definition to apply
Returns:
  the previous isolation level, if any
Throws:
  `SQLException` - if thrown by JDBC methods
See Also:
  - `prepareConnectionForTransaction(Connection, int, boolean)`

### resetConnectionAfterTransaction

public static void resetConnectionAfterTransaction(Connection con, @Nullable Integer previousIsolationLevel, boolean resetReadOnly)
Reset the given Connection after a transaction, regarding read-only flag and isolation level.

Parameters:
  `con` - the Connection to reset
  `previousIsolationLevel` - the isolation level to restore, if any
  `resetReadOnly` - whether to reset the connection's read-only flag
Since:
  5.2.1
See Also:
  - `prepareConnectionForTransaction(java.sql.Connection, org.springframework.transaction.TransactionDefinition)`
  - `Connection.setTransactionIsolation(int)`
  - `Connection.setReadOnly(boolean)`

### resetConnectionAfterTransaction

@Deprecated public static void resetConnectionAfterTransaction(Connection con, @Nullable Integer previousIsolationLevel)
Deprecated.
as of 5.1.11, in favor of `resetConnectionAfterTransaction(Connection, Integer, boolean)`
Reset the given Connection after a transaction, regarding read-only flag and isolation level.

Parameters:
  `con` - the Connection to reset
  `previousIsolationLevel` - the isolation level to restore, if any

### isConnectionTransactional

public static boolean isConnectionTransactional(Connection con, @Nullable DataSource dataSource)
Determine whether the given JDBC Connection is transactional, that is, bound to the current thread by Spring's transaction facilities.

Parameters:
  `con` - the Connection to check
  `dataSource` - the DataSource that the Connection was obtained from (may be `null`)
Returns:
  whether the Connection is transactional
See Also:
  - `getConnection(DataSource)`

### applyTransactionTimeout

public static void applyTransactionTimeout(Statement stmt, @Nullable DataSource dataSource) throws SQLException
Apply the current transaction timeout, if any, to the given JDBC Statement object.

Parameters:
  `stmt` - the JDBC Statement object
  `dataSource` - the DataSource that the Connection was obtained from
Throws:
  `SQLException` - if thrown by JDBC methods
See Also:
  - `Statement.setQueryTimeout(int)`

### applyTimeout

public static void applyTimeout(Statement stmt, @Nullable DataSource dataSource, int timeout) throws SQLException
Apply the specified timeout - overridden by the current transaction timeout, if any - to the given JDBC Statement object.

Parameters:
  `stmt` - the JDBC Statement object
  `dataSource` - the DataSource that the Connection was obtained from
  `timeout` - the timeout to apply (or 0 for no timeout outside of a transaction)
Throws:
  `SQLException` - if thrown by JDBC methods
See Also:
  - `Statement.setQueryTimeout(int)`

### releaseConnection

public static void releaseConnection(@Nullable Connection con, @Nullable DataSource dataSource)
Close the given Connection, obtained from the given DataSource, if it is not managed externally (that is, not bound to the thread).

Parameters:
  `con` - the Connection to close if necessary (if this is `null`, the call will be ignored)
  `dataSource` - the DataSource that the Connection was obtained from (may be `null`)
See Also:
  - `getConnection(javax.sql.DataSource)`

### doReleaseConnection

public static void doReleaseConnection(@Nullable Connection con, @Nullable DataSource dataSource) throws SQLException
Actually close the given Connection, obtained from the given DataSource. Same as `releaseConnection(java.sql.Connection, javax.sql.DataSource)`, but throwing the original SQLException.

Directly accessed by `TransactionAwareDataSourceProxy`.

Parameters:
  `con` - the Connection to close if necessary (if this is `null`, the call will be ignored)
  `dataSource` - the DataSource that the Connection was obtained from (may be `null`)
Throws:
  `SQLException` - if thrown by JDBC methods
See Also:
  - `doGetConnection(javax.sql.DataSource)`

### doCloseConnection

public static void doCloseConnection(Connection con, @Nullable DataSource dataSource) throws SQLException
Close the Connection, unless a `SmartDataSource` doesn't want us to.

Parameters:
  `con` - the Connection to close if necessary
  `dataSource` - the DataSource that the Connection was obtained from
Throws:
  `SQLException` - if thrown by JDBC methods
See Also:
  - `Connection.close()`
  - `SmartDataSource.shouldClose(Connection)`

### getTargetConnection

public static Connection getTargetConnection(Connection con)
Return the innermost target Connection of the given Connection. If the given Connection is a proxy, it will be unwrapped until a non-proxy Connection is found. Otherwise, the passed-in Connection will be returned as-is.

Parameters:
  `con` - the Connection proxy to unwrap
Returns:
  the innermost target Connection, or the passed-in one if no proxy
See Also:
  - `ConnectionProxy.getTargetConnection()`