You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@openjpa.apache.org by pp...@apache.org on 2009/02/18 22:28:50 UTC

svn commit: r745661 - /openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java

Author: ppoddar
Date: Wed Feb 18 21:28:50 2009
New Revision: 745661

URL: http://svn.apache.org/viewvc?rev=745661&view=rev
Log:
OPENJPA-703: A tentative change for a reported locking problem. Ready to be rolled back if turns out to be too costly.

Modified:
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java?rev=745661&r1=745660&r2=745661&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/QueryImpl.java Wed Feb 18 21:28:50 2009
@@ -33,6 +33,7 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.TreeMap;
+import java.util.concurrent.locks.ReentrantLock;
 
 import javax.persistence.FlushModeType;
 import javax.persistence.LockModeType;
@@ -81,7 +82,7 @@
 	private Map<String, Object> _named;
 	private Map<Integer, Object> _positional;
 	private String _id;
-	
+    private transient ReentrantLock _lock = null;
 	private final HintHandler _hintHandler;
 
 	/**
@@ -96,6 +97,7 @@
 		_em = em;
 		_query = new DelegatingQuery(query, ret);
 		_hintHandler = new HintHandler(this);
+		_lock = new ReentrantLock();
 	}
 
 	/**
@@ -256,15 +258,19 @@
 		if (!isNative() && _query.getOperation() != QueryOperations.OP_SELECT)
 			throw new InvalidStateException(_loc.get("not-select-query", _query
 					.getQueryString()), null, null, false);
-		
-        Map params = _positional != null ? _positional 
-            : _named != null ? _named : new HashMap();
-        boolean registered = preExecute(params);
-        Object result = _query.execute(params);
-        if (registered) {
-            postExecute(result);
-        }
-        return result;
+		try {
+		    lock();
+            Map params = _positional != null ? _positional 
+                : _named != null ? _named : new HashMap();
+            boolean registered = preExecute(params);
+            Object result = _query.execute(params);
+            if (registered) {
+                postExecute(result);
+            }
+            return result;
+		} finally {
+		    unlock();
+		}
 	}
 	
 	public List getResultList() {
@@ -618,7 +624,7 @@
      * 
      * @return true if the prepared query can be initialized.
      */
-    boolean postExecute(Object result) {
+    private boolean postExecute(Object result) {
         PreparedQueryCache cache = _em.getPreparedQueryCache();
         if (cache == null) {
             return false;
@@ -662,4 +668,15 @@
         _id = id;
         return this;
     }
+    
+    public void lock() {
+        if (_lock != null) 
+            _lock.lock();
+    }
+
+    public void unlock() {
+        if (_lock != null)
+            _lock.unlock();
+    }
+
 }