Your proposal will break almost any usage of local tx jdbc. If you really
feel this is the best solution please write a separate ConnectionManager
not used by the LocalTx stuff.
I think your solution is also woefully inefficient as it ties up many xa
connections for just one transaction.
I would really like to know if the jboss 4 xa wrapper solves the problems,
as I think it would, by using the same jdbc connection handle for all jca
connection handles. Have you tried it?
I am still waiting for some clear feedback on this wrapper on the lines of
"It works with Oracle" since I still have some hope of including it in
jboss 3.2.
thanks
david jencks
On 2002.11.04 15:02:05 -0500 Igor Fedorenko wrote:
>
> David Jencks wrote:
> > I've looked at this in more detail and am 99.9% sure this proposal is a
> bad
> > idea. I think it will break local tx support.
> >
> > I also think using the 4.0 xa wrapper will solve the problem.
> I agree that suggested implementation breaks local tx and in this sense
> is "bad". However, I believe that I can write better implementation that
> deals with XA connections only. If the plan is to backport 4.0 xa
> wrapper to 3.2 I would be happy to help with it. If the plan is to ship
> 3.2 with the old xa wrapper, then we should fix this problem in order to
> support xa-oracle.
>
> >
> > Also, the jdbc spec you quote seems to me to effectively prohibit
> holding a
> > jdbc connection from an xa or pooled driver while you call another ejb:
> the
> > connection will have been closed when the call returns. Therefore, if
> you
> > want portable code, you MUST close connections before calling another
> ejb,
> > and if you do this, the problem you are trying to solve disappears.
> 1. I guess the spec says that (theoretically) container can reallocate
> xa connection from a lower priority task to a higher priority task.
>
> 2. Specification does not require/imply that the same xa connection
> should or should not be used for nested ejb call. At the same time is
> specifically says that only one logical handle can be active at any
> instant. This means that we can implement any connection management
> schema as long as it does not violate what is explicitly prohibited. I
> believe that suggested connection management schema (xa connection is
> associated with a transation but not allocated for more then one ejb
> call at a time) is perfectly valid.
>
> >
> >
> > If I missed something please enlighten me.
> >
> > thanks
> > david jencks
> >
> > On 2002.11.01 11:29:09 -0500 Igor Fedorenko wrote:
> >
> >>Ok, here is the same example with some more details/comments. There was
>
> >>a mistake in my original explanation and I apoligize for confusion.
> >>
> >>BeanA allocates a connection
> >> - TxConnectionManager.getManagedConnection allocates
> >> new managed connection mc1 of type
> >> org.jboss.resource.adapter.jdbc.xa.XAManagedConnection which
> >> is a wrapper for (oracle) xa connection xaconn1.
> >> - TxConnectionManager.registerConnectionEventListener(mc1)
> >> creates new TxConnectionEventListener and calls
> >> mc1.addConnectionEventListener
> >> - mc1 gets enlisted into the transaction,
> >> TxConnectionEventListener.enlist is called and mc1 is added
> >> into txToManagedConnectionMap
> >> - mc1.getConnection() is called to get sql connection, it
> >> gets conn1 through xaconn1.getConnection()
> >>BeanA calls BeanB
> >> - nothing special here
> >>BeanB allocates a connection and gets instance conn2 from the same
> >>xaconn1
> >> - TxConnectionManager.getManagedConnection gets mc1 from
> >> txToManagedConnectionMap
> >> - mc1.getConnection() is called to get sql connection, it
> >> gets conn2 through xaconn1.getConnection() and implicitly
> >> invalidates conn1 held by BeanA (see quote below)
> >>BeanB closes the connection and returns
> >> - nothing special
> >>BeanA tries to use the connection
> >> - SQLException("Logical handle no longer valid").
> >>
> >>A quote from JDBC 2.0 stdext, section 6.2.3 "Retrieving a Connection":
> >>
> >><quote>
> >>An individual PooledConnection object will usually be asked to produce
> a
> >>series of Connection objects during its lifetime. Only one of these
> >>Connection objects may be open at a particular point in time. The
> >>connection pooling implementation must call
> >>PooledConnection.getConnection() each time a new reference to a
> >>pooledConnection is handed out to the JDBC application layer. Each call
>
> >>to PooledConnection.getConnection() must return a newly constructed
> >>Connection object that exhibits the default Connection behavior. Only
> >>the most recent Connection object produced from a particular
> >>PooledConnection is open. An existing Connection object is
> automatically
> >>closed, if the getConnection() method of its associated Pooled-
> >>Connection is called again, before it has been explicitly closed by the
>
> >>application. This gives the application server a way to �take away� a
> >>Connection from the application if it wishes, and give it out to
> someone
> >>else. This capability will not likely be used frequently in practice.
> >></quote>
> >>
> >>Attached is a proposed fix. Hope this makes the problem clearer.
> >>
> >>David Jencks wrote:
> >>
> >>>I don't understand. Can you repeat your explanation of the problem
> >>
> >>clearly
> >>
> >>>indicating what is a ManagedConnection and what is a Connection? From
> >>
> >>your
> >>
> >>>description it looks like perhaps the problem is that we are reusing
> >>
> >>the
> >>
> >>>java.sql.Connection obtained from a XAConnection? This would not be a
> >>>problem with the trackConnectionByTx logic but with the xa wrapper.
> >>>
> >>>thanks
> >>>david jencks
> >>>
> >>>
> >>>On 2002.11.01 08:12:05 -0500 Igor Fedorenko wrote:
> >>>
> >>>
> >>>>Hi,
> >>>>
> >>>>There is a problem with trackConnectionByTx in the current CVS
> version
> >>>>of JBoss 3.2 which occurs when two beans access the same datasource
> >>>
> >>>>from the same transaction. I am not 100% sure about original
> >>>
> >>>>implementation intends and would like to give others an opportunity
> to
> >>>>complain before I check in updated trackConnectionByTx logic.
> >>>>Consider the following example
> >>>>
> >>>>- BeanA allocates a connection and gets an instance conn1
> >>>>- BeanA calls BeanB
> >>>>- BeanB allocates a connection and gets the same instance conn1
> >>>>- BeanB closes the connection and returns
> >>>>- BeanA tries to use the connection and gets SQLException("Logical
> >>>>handle is closed").
> >>>>
> >>>>Updated trackConnectionByTx logic will return the
> >>>>same connection only if the connection has not been allocated yet
> >>>>(condition
> >>>>"BaseConnectionManager2.ConnectionListener.isManagedConnectionFree()");
> >>>>otherwise allocate and return new connection.
> >>>>
> >>>>Any objections?
> >>>
> >>--
> >>Igor Fedorenko
> >>Think smart. Think automated. Think Dynamics.
> >>www.thinkdynamics.com
> >>
> >>Index: TxConnectionManager.java
> >>===================================================================
> >>RCS file:
>/cvsroot/jboss/jbosscx/src/main/org/jboss/resource/connectionmanager/TxConnectionManager.java,v
> >>retrieving revision 1.2.2.1
> >>diff -u -r1.2.2.1 TxConnectionManager.java
> >>--- TxConnectionManager.java 12 Sep 2002 01:23:46
> >>-0000 1.2.2.1
> >>+++ TxConnectionManager.java 1 Nov 2002 16:06:11 -0000
> >>@@ -13,13 +13,13 @@
> >> import java.util.HashMap;
> >> import java.util.HashSet;
> >> import java.util.Iterator;
> >>+import java.util.List;
> >> import java.util.Map;
> >> import java.util.Set;
> >>-import javax.management.ObjectName;
> >>+
> >> import javax.naming.InitialContext;
> >> import javax.resource.ResourceException;
> >> import javax.resource.spi.ConnectionEvent;
> >>-import javax.resource.spi.ConnectionEventListener;
> >> import javax.resource.spi.ConnectionRequestInfo;
> >> import javax.resource.spi.ManagedConnection;
> >> import javax.resource.spi.ManagedConnectionFactory;
> >>@@ -34,8 +34,6 @@
> >> import javax.transaction.xa.XAResource;
> >> import javax.transaction.xa.Xid;
> >>
> >>-import org.jboss.system.Registry;
> >>-
> >> import org.jboss.logging.Logger;
> >>
> >> /**
> >>@@ -129,6 +127,7 @@
> >>
> >> private boolean localTransactions;
> >>
> >>+ // maps tx => List of connections
> >> private final Map txToManagedConnectionMap = new HashMap();
> >>
> >> /**
> >>@@ -261,8 +260,25 @@
> >> ManagedConnection mc = null;
> >> synchronized (txToManagedConnectionMap)
> >> {
> >>- mc = (ManagedConnection)txToManagedConnectionMap.get(tx);
> >>+ List conns = (List) txToManagedConnectionMap.get(tx);
> >>+ if( conns != null )
> >>+ {
> >>+ Iterator i = conns.iterator();
> >>+ while( i.hasNext() )
> >>+ {
> >>+ ManagedConnection conn = (ManagedConnection)
> >>i.next();
> >>+ ConnectionListener listener =
> >>getConnectionEventListener(conn);
> >>+ if( listener != null && listener instanceof
> >>TxConnectionEventListener
> >>+ && ((TxConnectionEventListener)
> >>listener)._isManagedConnectionFree() )
> >>+ {
> >>+ mc = conn;
> >>+ break;
> >>+ }
> >>+ }
> >>+ }
> >>+// mc = (ManagedConnection)txToManagedConnectionMap.get(tx);
> >> }
> >>+ // make sure that connection is not allocated by the
> client
> >> if (mc != null)
> >> {
> >> if (log.isTraceEnabled())
> >>@@ -443,7 +459,13 @@
> >> //Here we actually track the cx by tx.
> >> synchronized(txToManagedConnectionMap)
> >> {
> >>- txToManagedConnectionMap.put(currentTx,
> >>this.getManagedConnection());
> >>+ List conns = (List)
> >>txToManagedConnectionMap.get(currentTx);
> >>+ if( conns == null )
> >>+ {
> >>+ conns = new ArrayList();
> >>+ txToManagedConnectionMap.put(currentTx, conns);
> >>+ }
> >>+ conns.add(this.getManagedConnection());
> >> }
> >>
> >> } // end of if ()
> >>@@ -576,7 +598,15 @@
> >> {
> >> synchronized(txToManagedConnectionMap)
> >> {
> >>- txToManagedConnectionMap.remove(currentTx);
> >>+ List conns = (List)
> >
> > txToManagedConnectionMap.get(currentTx);
> >
> >>+ if( conns != null )
> >>+ {
> >>+ conns.remove(ce.getConnectionHandle());
> >>+ if( conns.isEmpty() )
> >>+ {
> >>+ txToManagedConnectionMap.remove(currentTx);
> >>+ }
> >>+ }
> >> }
> >> }
> >> currentTx = null;
> >>@@ -595,6 +625,10 @@
> >> {
> >> return false;
> >> } // end of if ()
> >>+ return super.isManagedConnectionFree();
> >>+ }
> >>+ boolean _isManagedConnectionFree()
> >>+ {
> >> return super.isManagedConnectionFree();
> >> }
> >>
> >>
> >
> >
> >
> > -------------------------------------------------------
> > This SF.net email is sponsored by: ApacheCon, November 18-21 in
> > Las Vegas (supported by COMDEX), the only Apache event to be
> > fully supported by the ASF. http://www.apachecon.com
> > _______________________________________________
> > Jboss-development mailing list
> > [EMAIL PROTECTED]
> > https://lists.sourceforge.net/lists/listinfo/jboss-development
>
> --
> Igor Fedorenko
> Think smart. Think automated. Think Dynamics.
> www.thinkdynamics.com
>
>
>
> -------------------------------------------------------
> This SF.net email is sponsored by: ApacheCon, November 18-21 in
> Las Vegas (supported by COMDEX), the only Apache event to be
> fully supported by the ASF. http://www.apachecon.com
> _______________________________________________
> Jboss-development mailing list
> [EMAIL PROTECTED]
> https://lists.sourceforge.net/lists/listinfo/jboss-development
>
>
-------------------------------------------------------
This SF.net email is sponsored by: ApacheCon, November 18-21 in
Las Vegas (supported by COMDEX), the only Apache event to be
fully supported by the ASF. http://www.apachecon.com
_______________________________________________
Jboss-development mailing list
[EMAIL PROTECTED]
https://lists.sourceforge.net/lists/listinfo/jboss-development