You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@tomee.apache.org by jg...@apache.org on 2015/07/30 16:53:21 UTC

[10/17] tomee git commit: too slow flush from idea, sorry for the noise

too slow flush from idea, sorry for the noise

Conflicts:
	container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java


Project: http://git-wip-us.apache.org/repos/asf/tomee/repo
Commit: http://git-wip-us.apache.org/repos/asf/tomee/commit/4586f1e6
Tree: http://git-wip-us.apache.org/repos/asf/tomee/tree/4586f1e6
Diff: http://git-wip-us.apache.org/repos/asf/tomee/diff/4586f1e6

Branch: refs/heads/tomee-1.7.x
Commit: 4586f1e65887399f68969f8cfd2e59b04551b823
Parents: d087efb
Author: Romain Manni-Bucau <rm...@apache.org>
Authored: Thu Jul 16 13:55:14 2015 +0200
Committer: Jonathan Gallimore <jo...@jrg.me.uk>
Committed: Thu Jul 30 14:04:17 2015 +0100

----------------------------------------------------------------------
 .../jdbc/managed/local/ManagedConnection.java   | 115 ++++++++++++-------
 1 file changed, 73 insertions(+), 42 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/tomee/blob/4586f1e6/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java
----------------------------------------------------------------------
diff --git a/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java b/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java
index 25e1727..c46365e 100644
--- a/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java
+++ b/container/openejb-core/src/main/java/org/apache/openejb/resource/jdbc/managed/local/ManagedConnection.java
@@ -70,77 +70,108 @@ public class ManagedConnection implements InvocationHandler {
             return "ManagedConnection{" + delegate + "}";
         }
         if ("hashCode".equals(mtdName)) {
-            return delegate.hashCode();
+            return hashCode();
         }
         if ("equals".equals(mtdName)) {
-            return delegate.equals(args[0]);
+            return args[0] == this || (delegate != null && delegate.equals(args[0]));
+        }
+
+        // allow to get delegate if needed by the underlying program
+        if (Wrapper.class == method.getDeclaringClass() && args.length == 1 && Connection.class == args[0]) {
+            if ("isWrapperFor".equals(mtdName)) {
+                return true;
+            }
+            if ("unwrap".equals(mtdName)) {
+                return delegate;
+            }
         }
 
         // here the real logic starts
         try {
             final Transaction transaction = transactionManager.getTransaction();
 
-            if (transaction == null) { // shouldn't be possible
+            // shouldn't be used without a transaction but if so just delegate to the actual connection
+            if (transaction == null) {
+                if (delegate == null) {
+                    newConnection();
+                }
                 return invoke(method, delegate, args);
             }
 
             // if we have a tx check it is the same this connection is linked to
-            if (currentTransaction != null) {
-                if (isUnderTransaction(currentTransaction.getStatus())) {
-                    if (!currentTransaction.equals(transaction)) {
-                        throw new SQLException("Connection can not be used while enlisted in another transaction");
-                    }
-                    return invokeUnderTransaction(delegate, method, args);
-                } else {
-                    close(delegate);
+            if (currentTransaction != null && isUnderTransaction(currentTransaction.getStatus())) {
+                if (!currentTransaction.equals(transaction)) {
+                    throw new SQLException("Connection can not be used while enlisted in another transaction");
                 }
+                return invokeUnderTransaction(delegate, method, args);
             }
 
-            // get the already bound connection to the current transaction
-            // or enlist this one in the tx
-            final int status = transaction.getStatus();
-            if (isUnderTransaction(status)) {
-                final Connection connection = connectionByTx.get(transaction);
-                if (connection != delegate) {
-                    if (connection != null) { // use already existing one
-                        delegate.close(); // return to pool
-                        delegate = connection;
-                    } else {
-                        connectionByTx.put(transaction, delegate);
-                        currentTransaction = transaction;
-                        try {
-                            transaction.enlistResource(getXAResource());
-                        } catch (final RollbackException ignored) {
-                            // no-op
-                        } catch (final SystemException e) {
-                            throw new SQLException("Unable to enlist connection the transaction", e);
-                        }
+            // get the already bound connection to the current transaction or enlist this one in the tx
+            if (isUnderTransaction(transaction.getStatus())) {
+                Connection connection = Connection.class.cast(registry.getResource(key));
+                if (connection == null && delegate == null) {
+                    newConnection();
+                    connection = delegate;
 
-                        transaction.registerSynchronization(new ClosingSynchronization(delegate, connectionByTx));
-
-                        try {
-                            setAutoCommit(false);
-                        } catch (final SQLException xae) { // we are already in a transaction so this can't be called from a user perspective - some XA DataSource prevents it in their code
-                            final String message = "Can't set auto commit to false cause the XA datasource doesn't support it, this is likely an issue";
-                            if (LOGGER.isDebugEnabled()) { // we don't want to print the exception by default
-                                LOGGER.warning(message, xae);
-                            } else {
-                                LOGGER.warning(message);
-                            }
+                    registry.putResource(transaction, delegate);
+                    currentTransaction = transaction;
+                    try {
+                        transaction.enlistResource(getXAResource());
+                    } catch (final RollbackException ignored) {
+                        // no-op
+                    } catch (final SystemException e) {
+                        throw new SQLException("Unable to enlist connection the transaction", e);
+                    }
+
+                    transaction.registerSynchronization(new ClosingSynchronization(delegate));
+
+                    try {
+                        setAutoCommit(false);
+                    } catch (final SQLException xae) { // we are alreay in a transaction so this can't be called from a user perspective - some XA DataSource prevents it in their code
+                        final String message = "Can't set auto commit to false cause the XA datasource doesn't support it, this is likely an issue";
+                        final Logger logger = Logger.getInstance(LogCategory.OPENEJB_RESOURCE_JDBC, ManagedConnection.class);
+                        if (logger.isDebugEnabled()) { // we don't want to print the exception by default
+                            logger.warning(message, xae);
+                        } else {
+                            logger.warning(message);
                         }
                     }
+                } else if (delegate == null) { // shouldn't happen
+                    delegate = connection;
                 }
 
-                return invokeUnderTransaction(delegate, method, args);
+                return invokeUnderTransaction(connection, method, args);
             }
 
+            // we shouldn't come here, tempted to just throw an exception
+            if (delegate == null) {
+                newConnection();
+            }
             return invoke(method, delegate, args);
         } catch (final InvocationTargetException ite) {
             throw ite.getTargetException();
         }
     }
 
+    protected Object newConnection() throws SQLException {
+        final Object connection = DataSource.class.isInstance(key.ds) ?
+                (key.user == null ? DataSource.class.cast(key.ds).getConnection() : DataSource.class.cast(key.ds).getConnection(key.user, key.pwd)) :
+                (key.user == null ? XADataSource.class.cast(key.ds).getXAConnection() : XADataSource.class.cast(key.ds).getXAConnection(key.user, key.pwd));
+        if (XAConnection.class.isInstance(connection)) {
+            xaConnection = XAConnection.class.cast(connection);
+            delegate = xaConnection.getConnection();
+            xaResource = xaConnection.getXAResource();
+        } else {
+            delegate = Connection.class.cast(connection);
+            xaResource = new LocalXAResource(delegate);
+        }
+        return connection;
+    }
+
     protected void setAutoCommit(final boolean value) throws SQLException {
+        if (delegate == null) {
+            newConnection();
+        }
         delegate.setAutoCommit(value);
     }