public class TransactionAwareConnectionFactoryProxy extends DelegatingConnectionFactory
ConnectionFactory
, adding
awareness of Spring-managed transactions. Similar to a transactional JNDI
ConnectionFactory as provided by a Java EE server.
Data access code that should remain unaware of Spring's data access support
can work with this proxy to seamlessly participate in Spring-managed transactions.
Note that the transaction manager, for example the CciLocalTransactionManager
,
still needs to work with underlying ConnectionFactory, not with this proxy.
Make sure that TransactionAwareConnectionFactoryProxy is the outermost
ConnectionFactory of a chain of ConnectionFactory proxies/adapters.
TransactionAwareConnectionFactoryProxy can delegate either directly to the
target connection pool or to some intermediate proxy/adapter like
ConnectionSpecConnectionFactoryAdapter
.
Delegates to ConnectionFactoryUtils
for automatically participating in
thread-bound transactions, for example managed by CciLocalTransactionManager
.
getConnection
calls and close
calls on returned Connections
will behave properly within a transaction, i.e. always operate on the transactional
Connection. If not within a transaction, normal ConnectionFactory behavior applies.
This proxy allows data access code to work with the plain JCA CCI API and still participate in Spring-managed transactions, similar to CCI code in a Java EE/JTA environment. However, if possible, use Spring's ConnectionFactoryUtils, CciTemplate or CCI operation objects to get transaction participation even without a proxy for the target ConnectionFactory, avoiding the need to define such a proxy in the first place.
NOTE: This ConnectionFactory proxy needs to return wrapped Connections in order to handle close calls properly. Therefore, the returned Connections cannot be cast to a native CCI Connection type or to a connection pool implementation type.
ConnectionFactory.getConnection()
,
Connection.close()
,
ConnectionFactoryUtils.doGetConnection(javax.resource.cci.ConnectionFactory)
,
ConnectionFactoryUtils.doReleaseConnection(javax.resource.cci.Connection, javax.resource.cci.ConnectionFactory)
,
Serialized FormConstructor and Description |
---|
TransactionAwareConnectionFactoryProxy()
Create a new TransactionAwareConnectionFactoryProxy.
|
TransactionAwareConnectionFactoryProxy(ConnectionFactory targetConnectionFactory)
Create a new TransactionAwareConnectionFactoryProxy.
|
Modifier and Type | Method and Description |
---|---|
Connection |
getConnection()
Delegate to ConnectionFactoryUtils for automatically participating in Spring-managed
transactions.
|
protected Connection |
getTransactionAwareConnectionProxy(Connection target,
ConnectionFactory cf)
Wrap the given Connection with a proxy that delegates every method call to it
but delegates
close calls to ConnectionFactoryUtils. |
afterPropertiesSet, getConnection, getMetaData, getRecordFactory, getReference, getTargetConnectionFactory, obtainTargetConnectionFactory, setReference, setTargetConnectionFactory
public TransactionAwareConnectionFactoryProxy()
public TransactionAwareConnectionFactoryProxy(ConnectionFactory targetConnectionFactory)
targetConnectionFactory
- the target ConnectionFactorypublic Connection getConnection() throws ResourceException
getConnection
in interface ConnectionFactory
getConnection
in class DelegatingConnectionFactory
ResourceException
ConnectionFactoryUtils.doGetConnection(javax.resource.cci.ConnectionFactory)
protected Connection getTransactionAwareConnectionProxy(Connection target, ConnectionFactory cf)
close
calls to ConnectionFactoryUtils.target
- the original Connection to wrapcf
- ConnectionFactory that the Connection came fromConnection.close()
,
ConnectionFactoryUtils.doReleaseConnection(javax.resource.cci.Connection, javax.resource.cci.ConnectionFactory)