Class SingleConnectionDataSource

All Implemented Interfaces:
AutoCloseable, Wrapper, CommonDataSource, DataSource, DisposableBean, SmartDataSource

public class SingleConnectionDataSource extends DriverManagerDataSource implements SmartDataSource, AutoCloseable, DisposableBean
Implementation of SmartDataSource that wraps a single JDBC Connection which is not closed after use. Obviously, this is not multi-threading capable.

Note that at shutdown, someone should close the underlying Connection via the close() method. Client code will never call close on the Connection handle if it is SmartDataSource-aware (for example, uses DataSourceUtils.releaseConnection).

If client code will call close() in the assumption of a pooled Connection, like when using persistence tools, set "suppressClose" to "true". This will return a close-suppressing proxy instead of the physical Connection.

This is primarily intended for testing. For example, it enables easy testing outside an application server, for code that expects to work on a DataSource. In contrast to DriverManagerDataSource, it reuses the same Connection all the time, avoiding excessive creation of physical Connections.

Author:
Rod Johnson, Juergen Hoeller
See Also:
  • Constructor Details

    • SingleConnectionDataSource

      public SingleConnectionDataSource()
      Constructor for bean-style configuration.
    • SingleConnectionDataSource

      public SingleConnectionDataSource(String url, String username, String password, boolean suppressClose)
      Create a new SingleConnectionDataSource with the given standard DriverManager parameters.
      Parameters:
      url - the JDBC URL to use for accessing the DriverManager
      username - the JDBC username to use for accessing the DriverManager
      password - the JDBC password to use for accessing the DriverManager
      suppressClose - if the returned Connection should be a close-suppressing proxy or the physical Connection
      See Also:
    • SingleConnectionDataSource

      public SingleConnectionDataSource(String url, boolean suppressClose)
      Create a new SingleConnectionDataSource with the given standard DriverManager parameters.
      Parameters:
      url - the JDBC URL to use for accessing the DriverManager
      suppressClose - if the returned Connection should be a close-suppressing proxy or the physical Connection
      See Also:
    • SingleConnectionDataSource

      public SingleConnectionDataSource(Connection target, boolean suppressClose)
      Create a new SingleConnectionDataSource with a given Connection.
      Parameters:
      target - underlying target Connection
      suppressClose - if the Connection should be wrapped with a Connection that suppresses close() calls (to allow for normal close() usage in applications that expect a pooled Connection but do not know our SmartDataSource interface)
  • Method Details

    • setSuppressClose

      public void setSuppressClose(boolean suppressClose)
      Specify whether the returned Connection should be a close-suppressing proxy or the physical Connection.
    • isSuppressClose

      protected boolean isSuppressClose()
      Return whether the returned Connection will be a close-suppressing proxy or the physical Connection.
    • setRollbackBeforeClose

      public void setRollbackBeforeClose(boolean rollbackBeforeClose)
      Specify whether the shared Connection should be explicitly rolled back before close (if not in auto-commit mode).

      This is recommended for the Oracle JDBC driver in testing scenarios.

      Since:
      6.1.2
    • isRollbackBeforeClose

      protected boolean isRollbackBeforeClose()
      Return whether the shared Connection should be explicitly rolled back before close (if not in auto-commit mode).
      Since:
      6.1.2
    • setAutoCommit

      public void setAutoCommit(boolean autoCommit)
      Specify whether the returned Connection's "autoCommit" setting should be overridden.
    • getAutoCommitValue

      @Nullable protected Boolean getAutoCommitValue()
      Return whether the returned Connection's "autoCommit" setting should be overridden.
      Returns:
      the "autoCommit" value, or null if none to be applied
    • getConnection

      public Connection getConnection() throws SQLException
      Description copied from class: AbstractDriverBasedDataSource
      This implementation delegates to getConnectionFromDriver, using the default username and password of this DataSource.
      Specified by:
      getConnection in interface DataSource
      Overrides:
      getConnection in class AbstractDriverBasedDataSource
      Throws:
      SQLException
      See Also:
    • getConnection

      public Connection getConnection(String username, String password) throws SQLException
      Specifying a custom username and password doesn't make sense with a single Connection. Returns the single Connection if given the same username and password; throws an SQLException else.
      Specified by:
      getConnection in interface DataSource
      Overrides:
      getConnection in class AbstractDriverBasedDataSource
      Throws:
      SQLException
      See Also:
    • shouldClose

      public boolean shouldClose(Connection con)
      This is a single Connection: Do not close it when returning to the "pool".
      Specified by:
      shouldClose in interface SmartDataSource
      Parameters:
      con - the Connection to check
      Returns:
      whether the given Connection should be closed
      See Also:
    • close

      public void close()
      Close the underlying Connection. The provider of this DataSource needs to care for proper shutdown.

      As this class implements AutoCloseable, it can be used with a try-with-resource statement.

      Specified by:
      close in interface AutoCloseable
      Since:
      6.1.2
    • destroy

      public void destroy()
      Close the underlying Connection. The provider of this DataSource needs to care for proper shutdown.

      As this bean implements DisposableBean, a bean factory will automatically invoke this on destruction of the bean.

      Specified by:
      destroy in interface DisposableBean
    • initConnection

      public void initConnection() throws SQLException
      Initialize the underlying Connection via the DriverManager.
      Throws:
      SQLException
    • resetConnection

      public void resetConnection()
      Reset the underlying shared Connection, to be reinitialized on next access.
    • prepareConnection

      protected void prepareConnection(Connection con) throws SQLException
      Prepare the given Connection before it is exposed.

      The default implementation applies the auto-commit flag, if necessary. Can be overridden in subclasses.

      Parameters:
      con - the Connection to prepare
      Throws:
      SQLException
      See Also:
    • closeConnection

      protected void closeConnection(Connection con)
      Close the underlying shared Connection.
      Since:
      6.1.2
    • getCloseSuppressingConnectionProxy

      protected Connection getCloseSuppressingConnectionProxy(Connection target)
      Wrap the given Connection with a proxy that delegates every method call to it but suppresses close calls.
      Parameters:
      target - the original Connection to wrap
      Returns:
      the wrapped Connection