public class SingleConnectionDataSource extends DriverManagerDataSource implements SmartDataSource, DisposableBean
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 (e.g. 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.
Be aware that you will not be able to cast this to a native
OracleConnection
or the like anymore; you need to use a
NativeJdbcExtractor
then.
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.
getConnection()
,
Connection.close()
,
DataSourceUtils.releaseConnection(java.sql.Connection, javax.sql.DataSource)
,
NativeJdbcExtractor
logger
Constructor and Description |
---|
SingleConnectionDataSource()
Constructor for bean-style configuration.
|
SingleConnectionDataSource(Connection target,
boolean suppressClose)
Create a new SingleConnectionDataSource with a given Connection.
|
SingleConnectionDataSource(String url,
boolean suppressClose)
Create a new SingleConnectionDataSource with the given standard
DriverManager parameters.
|
SingleConnectionDataSource(String url,
String username,
String password,
boolean suppressClose)
Create a new SingleConnectionDataSource with the given standard
DriverManager parameters.
|
Modifier and Type | Method and Description |
---|---|
void |
destroy()
Close the underlying Connection.
|
protected Boolean |
getAutoCommitValue()
Return whether the returned Connection's "autoCommit" setting should be overridden.
|
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()
This implementation delegates to
getConnectionFromDriver ,
using the default username and password of this DataSource. |
Connection |
getConnection(String username,
String password)
Specifying a custom username and password doesn't make sense
with a single Connection.
|
void |
initConnection()
Initialize the underlying Connection via the DriverManager.
|
protected boolean |
isSuppressClose()
Return whether the returned Connection will be a close-suppressing proxy
or the physical Connection.
|
protected void |
prepareConnection(Connection con)
Prepare the given Connection before it is exposed.
|
void |
resetConnection()
Reset the underlying shared Connection, to be reinitialized on next access.
|
void |
setAutoCommit(boolean autoCommit)
Set whether the returned Connection's "autoCommit" setting should be overridden.
|
void |
setSuppressClose(boolean suppressClose)
Set whether 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".
|
getConnectionFromDriver, getConnectionFromDriverManager, setDriverClassName
getConnectionFromDriver, getConnectionProperties, getPassword, getUrl, getUsername, setConnectionProperties, setPassword, setUrl, setUsername
getLoginTimeout, getLogWriter, getParentLogger, isWrapperFor, setLoginTimeout, setLogWriter, unwrap
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
getLoginTimeout, getLogWriter, getParentLogger, setLoginTimeout, setLogWriter
isWrapperFor, unwrap
public SingleConnectionDataSource()
public SingleConnectionDataSource(String url, String username, String password, boolean suppressClose)
url
- the JDBC URL to use for accessing the DriverManagerusername
- the JDBC username to use for accessing the DriverManagerpassword
- the JDBC password to use for accessing the DriverManagersuppressClose
- if the returned Connection should be a
close-suppressing proxy or the physical ConnectionDriverManager.getConnection(String, String, String)
public SingleConnectionDataSource(String url, boolean suppressClose)
url
- the JDBC URL to use for accessing the DriverManagersuppressClose
- if the returned Connection should be a
close-suppressing proxy or the physical ConnectionDriverManager.getConnection(String, String, String)
public SingleConnectionDataSource(Connection target, boolean suppressClose)
target
- underlying target ConnectionsuppressClose
- 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)public void setSuppressClose(boolean suppressClose)
protected boolean isSuppressClose()
public void setAutoCommit(boolean autoCommit)
protected Boolean getAutoCommitValue()
null
if none to be appliedpublic Connection getConnection() throws SQLException
AbstractDriverBasedDataSource
getConnectionFromDriver
,
using the default username and password of this DataSource.getConnection
in interface DataSource
getConnection
in class AbstractDriverBasedDataSource
SQLException
AbstractDriverBasedDataSource.getConnectionFromDriver(String, String)
,
AbstractDriverBasedDataSource.setUsername(java.lang.String)
,
AbstractDriverBasedDataSource.setPassword(java.lang.String)
public Connection getConnection(String username, String password) throws SQLException
getConnection
in interface DataSource
getConnection
in class AbstractDriverBasedDataSource
SQLException
AbstractDriverBasedDataSource.getConnectionFromDriver(String, String)
public boolean shouldClose(Connection con)
shouldClose
in interface SmartDataSource
con
- the Connection to checkConnection.close()
public void destroy()
As this bean implements DisposableBean, a bean factory will automatically invoke this on destruction of its cached singletons.
destroy
in interface DisposableBean
public void initConnection() throws SQLException
SQLException
public void resetConnection()
protected void prepareConnection(Connection con) throws SQLException
The default implementation applies the auto-commit flag, if necessary. Can be overridden in subclasses.
con
- the Connection to prepareSQLException
setAutoCommit(boolean)
protected Connection getCloseSuppressingConnectionProxy(Connection target)
target
- the original Connection to wrap