You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pc...@apache.org on 2007/02/23 19:25:56 UTC

svn commit: r511043 - /incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java

Author: pcl
Date: Fri Feb 23 10:25:55 2007
New Revision: 511043

URL: http://svn.apache.org/viewvc?view=rev&rev=511043
Log:
OPENJPA-161

Modified:
    incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java

Modified: incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java
URL: http://svn.apache.org/viewvc/incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java?view=diff&rev=511043&r1=511042&r2=511043
==============================================================================
--- incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java (original)
+++ incubator/openjpa/trunk/openjpa-kernel/src/main/java/org/apache/openjpa/kernel/AbstractBrokerFactory.java Fri Feb 23 10:25:55 2007
@@ -37,6 +37,7 @@
 import org.apache.openjpa.lib.log.Log;
 import org.apache.openjpa.lib.util.Localizer;
 import org.apache.openjpa.lib.util.ReferenceHashSet;
+import org.apache.openjpa.lib.util.concurrent.ConcurrentHashMap;
 import org.apache.openjpa.lib.util.concurrent.ConcurrentReferenceHashSet;
 import org.apache.openjpa.lib.util.concurrent.ReentrantLock;
 import org.apache.openjpa.meta.MetaDataRepository;
@@ -71,7 +72,8 @@
     private final ReentrantLock _lock = new ReentrantLock();
 
     // maps global transactions to associated brokers
-    private transient Map _transactional = new HashMap();
+    private transient ConcurrentHashMap _transactional
+        = new ConcurrentHashMap();
 
     // weak-ref tracking of open brokers
     private transient Collection _brokers = new ConcurrentReferenceHashSet
@@ -369,7 +371,7 @@
             return factory;
 
         // reset these transient fields to empty values
-        _transactional = new HashMap();
+        _transactional = new ConcurrentHashMap();
         _brokers = new ConcurrentReferenceHashSet(
                 ConcurrentReferenceHashSet.WEAK);
 
@@ -450,20 +452,20 @@
             throw new GeneralException(e);
         }
 
-        synchronized (_transactional) {
-            Collection brokers = (Collection) _transactional.get(trans);
-            if (brokers != null) {
-                BrokerImpl broker;
-                for (Iterator itr = brokers.iterator(); itr.hasNext();) {
-                    broker = (BrokerImpl) itr.next();
-                    if (StringUtils.equals(broker.getConnectionUserName(),
-                        user) && StringUtils.equals
-                        (broker.getConnectionPassword(), pass))
-                        return broker;
-                }
+        Collection brokers = (Collection) _transactional.get(trans);
+        if (brokers != null) {
+            // we don't need to synchronize on brokers since one JTA transaction
+            // can never be active on multiple concurrent threads.
+            BrokerImpl broker;
+            for (Iterator itr = brokers.iterator(); itr.hasNext();) {
+                broker = (BrokerImpl) itr.next();
+                if (StringUtils.equals(broker.getConnectionUserName(),
+                    user) && StringUtils.equals
+                    (broker.getConnectionPassword(), pass))
+                    return broker;
             }
-            return null;
         }
+        return null;
     }
 
     /**
@@ -579,18 +581,16 @@
      */
     private void assertNoActiveTransaction() {
         Collection excs = null;
-        synchronized (_transactional) {
-            if (_transactional.isEmpty())
-                return;
+        if (_transactional.isEmpty())
+            return;
 
-            excs = new ArrayList(_transactional.size());
-            for (Iterator trans = _transactional.values().iterator();
-                trans.hasNext();) {
-                Collection brokers = (Collection) trans.next();
-                for (Iterator itr = brokers.iterator(); itr.hasNext();) {
-                    excs.add(new InvalidStateException(_loc.get("active")).
-                        setFailedObject(itr.next()));
-                }
+        excs = new ArrayList(_transactional.size());
+        for (Iterator trans = _transactional.values().iterator();
+            trans.hasNext();) {
+            Collection brokers = (Collection) trans.next();
+            for (Iterator itr = brokers.iterator(); itr.hasNext();) {
+                excs.add(new InvalidStateException(_loc.get("active")).
+                    setFailedObject(itr.next()));
             }
         }
 
@@ -626,20 +626,17 @@
             // synch broker and trans
             trans.registerSynchronization(broker);
 
-            synchronized (_transactional) {
-                Collection brokers = (Collection) _transactional.get(trans);
-                if (brokers == null) {
-                    brokers = new ArrayList(2);
-                    _transactional.put(trans, brokers);
-
-                    // register a callback to remove the trans from the
-                    // cache when it ends
-                    trans.registerSynchronization
-                        (new RemoveTransactionSync(trans));
-                }
-                brokers.add(broker);
+            // we don't need to synchronize on brokers or guard against multiple
+            // threads using the same trans since one JTA transaction can never
+            // be active on multiple concurrent threads.
+            Collection brokers = (Collection) _transactional.get(trans);
+            if (brokers == null) {
+                brokers = new ArrayList(2);
+                _transactional.put(trans, brokers);
+                trans.registerSynchronization(new RemoveTransactionSync(trans));
             }
-
+            brokers.add(broker);
+            
             return true;
         } catch (OpenJPAException ke) {
             throw ke;
@@ -665,10 +662,7 @@
         }
 
         public void afterCompletion(int status) {
-            synchronized (_transactional)
-			{
-				_transactional.remove (_trans);
-			}
+            _transactional.remove (_trans);
 		}
 	}
 }