Hi Dain,

thanks a lot for this input. Can you please resend your message to the
commons-dev list located at commons-dev@jakarta.apache.org ?

To add some a little bit confusion: The commons have just decided to
become a top-level project in their own right, so the development list
will move to [EMAIL PROTECTED] at some point in the near future.

Still, it would be great to follow up on your suggestions;
TransactionSupport would be a real benefit to DBCP. 

        Best regards
                Henning

On Tue, 2007-07-03 at 18:21 -0700, Dain Sundstrom wrote:
> I just posted a patch JIRA which adds support for container managed  
> connections to DBCP.  In an environment where you have an accessible  
> transaction manger such as Tomcat (when installed), Geronimo or  
> OpenEJB, this patch allows adds support for pooling managed  
> connections to an XA or non-XA data base.
> 
> There are many libraries that use DBCP for non-managed environments,  
> but when additional resources such as a JMS provider are added to the  
> mix, they have to replace DBCP with something else.  If you search  
> google for XA and DBCP, you will loads of painful direction on how to  
> replace DBCP with something else.  I personally want to use DBCP in  
> Tomcat with ActiveMQ.
> 
> Anyways, enough with motivation....
> 
> To use the new code, you need access to a TranactionManager (this  
> code just creates a new Geronimo one).
> 
>          transactionManager = new TransactionManagerImpl();
> 
> Then you either create an XADataSource and  
> DataSourceXAConectionFactory or as this code does, create a normal  
> DBCP ConnectionFactory and wrap it with a LocalXAConectionFactory
> 
>          Properties properties = new Properties();
>          properties.setProperty("user", "username");
>          properties.setProperty("password", "password");
>          ConnectionFactory connectionFactory = new  
> DriverConnectionFactory(
>                  new TesterDriver(),
>                  "jdbc:apache:commons:testdriver", properties);
> 
>          // wrap it with a LocalXAConnectionFactory
>          XAConnectionFactory xaConnectionFactory = new  
> LocalXAConnectionFactory(
>                  transactionManager,
>                  connectionFactory);
> 
> 
> Now you create a pool as normal (full reuse here).
> 
>          pool = new GenericObjectPool();
>          pool.setMaxActive(getMaxActive());
>          pool.setMaxWait(getMaxWait());
> 
>          // create the pool object factory
>          PoolableConnectionFactory factory = new  
> PoolableConnectionFactory(
>                  xaConnectionFactory,
>                  pool,
>                  null,
>                  "SELECT DUMMY FROM DUAL",
>                  true,
>                  true);
>          pool.setFactory(factory);
> 
> 
> Finally, you create a special ManagedDataSource using the pool above  
> and the special TransactionRegistry object obtained from the  
> XAConnectionFactory.
> 
>          ds = new ManagedDataSource(pool,  
> xaConnectionFactory.getTransactionRegistry());
>          ds.setAccessToUnderlyingConnectionAllowed(true);
> 
> 
> That's it.  The data source and connections work as normal until you  
> start a transaction using the TransactionManager.  When you use a  
> connection while the transaction is active, the connection is  
> enlisted in the transaction.  When the transaction is complete, the  
> connection is committed (or rolledback) and the connection returns to  
> normal.
> 
> Most of the new code extends existing classes or uses existing  
> classes without modification.  The key to this reuse is the  
> TransactionRegistry abstraction which maintains a map from the  
> Connection to the XAResource for that connection.  The XAResource is  
> needed to enlist a connection in a transaction.  The  
> TransactionRegistry and associated TransationContext class  
> encapsulate all interactions with the TransactionManager leaving the  
> Connection implementation relatively simple (making reuse easier).
> 
> For now the code is contained in the org.apache.commons.dbcp.managed  
> package, but I would suspect we may want to spread it out amongst the  
> existing packages instead of creating a feature specific package.   
> I'm also not sure what additional interfaces people may want such as  
> equivalents of the BasicDataSource or BasicDataSourceFactory.
> 
> The code has tests and has javadoc, but it needs real world testing  
> and some real docs.  I'm going try hooking it into OpenEJB and  
> running it's massive test suite with a couple of opensource DBs.
> 
> Anyways, I hope you all like it and accept the patch.  I'm around to  
> help with changes or whatever.  I also ran into a few bugs while  
> working on this that are already reported in JIRA (like the close  
> bugs) and am willing to help with those also.
> 
> -dain
> 
> 
> 
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: [EMAIL PROTECTED]
> For additional commands, e-mail: [EMAIL PROTECTED]



---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to