org.springframework.jdbc.datasource
Class SingleConnectionDataSource

java.lang.Object
  extended byorg.springframework.jdbc.datasource.AbstractDataSource
      extended byorg.springframework.jdbc.datasource.DriverManagerDataSource
          extended byorg.springframework.jdbc.datasource.SingleConnectionDataSource
All Implemented Interfaces:
DataSource, DisposableBean, SmartDataSource

public class SingleConnectionDataSource
extends DriverManagerDataSource
implements DisposableBean

Implementation of SmartDataSource that wraps a single 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 (e.g. uses DataSourceUtils.closeConnectionIfNecessary).

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. Be aware that you will not be able to cast this to a native OracleConnection or the like anymore.

This is primarily a test class. For example, it enables easy testing of code outside an application server, in conjunction with a simple JNDI environment. 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:
DataSourceUtils.closeConnectionIfNecessary(java.sql.Connection, javax.sql.DataSource)

Field Summary
 
Fields inherited from class org.springframework.jdbc.datasource.AbstractDataSource
logger
 
Constructor Summary
SingleConnectionDataSource()
          Constructor for bean-style configuration.
SingleConnectionDataSource(Connection target, boolean suppressClose)
          Create a new SingleConnectionDataSource with a given connection.
SingleConnectionDataSource(String driverClassName, String url, String username, String password, boolean suppressClose)
          Create a new SingleConnectionDataSource with the given standard DriverManager parameters.
 
Method Summary
 void destroy()
          Close the underlying connection.
protected  Connection getCloseSuppressingConnectionProxy(Connection target)
          Wrap the given Connection with a proxy that delegates every method call to it but suppresses close calls.
 Connection getConnection()
           
 Connection getConnection(String username, String password)
          Specifying a custom username and password doesn't make sense with a single connection.
protected  void init()
          Initialize the underlying connection via DriverManager.
protected  void init(Connection target)
          Initialize the underlying connection.
 boolean isSuppressClose()
          Return if the returned connection will be a close-suppressing proxy or the physical connection.
 void setSuppressClose(boolean suppressClose)
          Set if the returned connection should be a close-suppressing proxy or the physical connection.
 boolean shouldClose(Connection con)
          This is a single connection: Do not close it when returning to the "pool".
 
Methods inherited from class org.springframework.jdbc.datasource.DriverManagerDataSource
getConnectionFromDriverManager, getConnectionFromDriverManager, getDriverClassName, getPassword, getUrl, getUsername, setDriverClassName, setPassword, setUrl, setUsername
 
Methods inherited from class org.springframework.jdbc.datasource.AbstractDataSource
getLoginTimeout, getLogWriter, setLoginTimeout, setLogWriter
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 
Methods inherited from interface javax.sql.DataSource
getLoginTimeout, getLogWriter, setLoginTimeout, setLogWriter
 

Constructor Detail

SingleConnectionDataSource

public SingleConnectionDataSource()
Constructor for bean-style configuration.


SingleConnectionDataSource

public SingleConnectionDataSource(String driverClassName,
                                  String url,
                                  String username,
                                  String password,
                                  boolean suppressClose)
                           throws CannotGetJdbcConnectionException
Create a new SingleConnectionDataSource with the given standard DriverManager parameters.

Parameters:
suppressClose - if the returned connection should be a close-suppressing proxy or the physical connection.

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 Detail

setSuppressClose

public void setSuppressClose(boolean suppressClose)
Set if the returned connection should be a close-suppressing proxy or the physical connection.


isSuppressClose

public boolean isSuppressClose()
Return if the returned connection will be a close-suppressing proxy or the physical connection.


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
Overrides:
shouldClose in class DriverManagerDataSource

init

protected void init()
             throws SQLException
Initialize the underlying connection via DriverManager.

Throws:
SQLException

init

protected void init(Connection target)
Initialize the underlying connection. Wraps the connection with a close-suppressing proxy if necessary.

Parameters:
target - the JDBC Connection to use

destroy

public void destroy()
             throws SQLException
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 its cached singletons.

Specified by:
destroy in interface DisposableBean
Throws:
SQLException

getConnection

public Connection getConnection()
                         throws SQLException
Specified by:
getConnection in interface DataSource
Overrides:
getConnection in class DriverManagerDataSource
Throws:
SQLException

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, though.

Specified by:
getConnection in interface DataSource
Overrides:
getConnection in class DriverManagerDataSource
Throws:
SQLException

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


Copyright (C) 2003-2004 The Spring Framework Project.