Author: hthomann
Date: Sun Oct 18 19:50:19 2015
New Revision: 1709311

URL: http://svn.apache.org/viewvc?rev=1709311&view=rev
Log:
OPENJPA-2609: Sporadic ClassCastException occurs under heavy load when 
QuerySQLCache is enabled.  Merged 2.1.x changes to 2.2.x.

Modified:
    openjpa/branches/2.2.x/   (props changed)
    
openjpa/branches/2.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryCacheImpl.java

Propchange: openjpa/branches/2.2.x/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Sun Oct 18 19:50:19 2015
@@ -1,5 +1,5 @@
 /openjpa/branches/1.0.x:736493
 /openjpa/branches/2.0.x:1484136,1484287,1504611
-/openjpa/branches/2.1.x:1415379,1415398,1469090,1469949,1484300,1484313,1485010,1505837,1513249,1517838,1529241,1530146,1533218,1533280,1539188,1569528,1575444,1591536,1614935,1636464,1648430,1655218,1662610,1673300,1673491,1686894,1709201
+/openjpa/branches/2.1.x:1415379,1415398,1469090,1469949,1484300,1484313,1485010,1505837,1513249,1517838,1529241,1530146,1533218,1533280,1539188,1569528,1575444,1591536,1614935,1636464,1648430,1655218,1662610,1673300,1673491,1686894,1709201,1709309
 
/openjpa/branches/2.2.1.x:1415367,1415413,1415425,1469408,1470097,1484320,1484322,1491895,1504719,1529267,1529340,1530347,1531176,1533222,1539193,1584153,1648450,1651808,1686910
 
/openjpa/trunk:1416742,1420324,1430117,1431649,1436957,1436960,1448662,1448796,1451369,1456574,1456614,1459091,1461833,1469646,1469649,1469652,1504282,1558594,1600682,1600757,1603251,1626287,1632647

Modified: 
openjpa/branches/2.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryCacheImpl.java
URL: 
http://svn.apache.org/viewvc/openjpa/branches/2.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryCacheImpl.java?rev=1709311&r1=1709310&r2=1709311&view=diff
==============================================================================
--- 
openjpa/branches/2.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryCacheImpl.java
 (original)
+++ 
openjpa/branches/2.2.x/openjpa-jdbc/src/main/java/org/apache/openjpa/jdbc/kernel/PreparedQueryCacheImpl.java
 Sun Oct 18 19:50:19 2015
@@ -106,18 +106,25 @@ public class PreparedQueryCacheImpl impl
        }
        
        /**
-        * Cache the given query keyed by its identifier. Does not cache if the 
-        * identifier matches any exclusion pattern or has been marked as 
-        * non-cachable. Also register the identifier as not cachable against 
-        * the matched exclusion pattern.
+        * Cache the given query keyed by its identifier. Does not cache if the
+        * identifier matches any exclusion pattern or has been marked as
+        * non-cachable. Also register the identifier as not cachable against 
the
+        * matched exclusion pattern.
         */
        public boolean cache(PreparedQuery q) {
                lock(false);
                try {
                        String id = q.getIdentifier();
+
+                       // OPENJPA-2609: Make sure another thread didn't add 
the 'id'
+                       // while holding the 'lock'.
+                       if (_delegate.containsKey(id)) {
+                               return false;
+                       }
+
                        if (Boolean.FALSE.equals(isCachable(id))) {
                                if (_log != null && _log.isTraceEnabled())
-                    _log.trace(_loc.get("prepared-query-not-cachable", id));
+                                       
_log.trace(_loc.get("prepared-query-not-cachable", id));
                                return false;
                        }
                        Exclusion exclusion = getMatchedExclusionPattern(id);
@@ -126,8 +133,8 @@ public class PreparedQueryCacheImpl impl
                                return false;
                        }
                        _delegate.put(id, q);
-            if (_log != null && _log.isTraceEnabled())
-                _log.trace(_loc.get("prepared-query-cached", id));
+                       if (_log != null && _log.isTraceEnabled())
+                               _log.trace(_loc.get("prepared-query-cached", 
id));
                        return true;
                } finally {
                        unlock(false);


Reply via email to