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 2010/01/21 21:17:51 UTC

svn commit: r901845 - in /openjpa/trunk: openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java

Author: ppoddar
Date: Thu Jan 21 20:17:50 2010
New Revision: 901845

URL: http://svn.apache.org/viewvc?rev=901845&view=rev
Log:
OPENJPA-1477: Do not use cached PreparedQuery unless it is initialized

Modified:
    openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java
    openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java

Modified: openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java?rev=901845&r1=901844&r2=901845&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java (original)
+++ openjpa/trunk/openjpa-persistence-jdbc/src/test/java/org/apache/openjpa/persistence/jdbc/sqlcache/TestPreparedQueryCache.java Thu Jan 21 20:17:50 2010
@@ -41,6 +41,7 @@
 import org.apache.openjpa.lib.jdbc.AbstractJDBCListener;
 import org.apache.openjpa.lib.jdbc.JDBCEvent;
 import org.apache.openjpa.lib.jdbc.JDBCListener;
+import org.apache.openjpa.persistence.OpenJPAEntityManager;
 import org.apache.openjpa.persistence.OpenJPAEntityManagerFactorySPI;
 import org.apache.openjpa.persistence.OpenJPAEntityManagerSPI;
 import org.apache.openjpa.persistence.OpenJPAPersistence;
@@ -780,6 +781,32 @@
         em.getTransaction().rollback();
     }
     
+    public void testMultithreadedAccess() {
+        OpenJPAEntityManager em1 = emf.createEntityManager();
+        String jpql = "select p from Author p where p.name=:name";
+        int N = 5;
+        Thread[] threads =  new Thread[N];
+        QueryThread[] qts = new QueryThread[N];
+        for (int i = 0; i < N; i++) {
+            OpenJPAEntityManager emt = emf.createEntityManager();
+            qts[i] = new QueryThread(emt, jpql);
+            threads[i] = new Thread(qts[i]);
+            threads[i].setDaemon(true);
+        }
+        for (Thread t : threads) {
+            t.start(); 
+        }
+        for (int i = 0; i < N; i++) {
+            try {
+              threads[i].join();
+              assertFalse(qts[i].isFailed());
+            } catch (InterruptedException e) {
+                e.printStackTrace();
+                fail();
+            }
+        }
+    }
+    
     
     PreparedQueryCache getPreparedQueryCache() {
         return emf.getConfiguration().getQuerySQLCacheInstance();
@@ -967,5 +994,36 @@
             return new ArrayList<String>(sqls);
         }
     }
+    
+    public static class QueryThread implements Runnable {
+        private final OpenJPAEntityManager em;
+        private final String jpql;
+        private boolean failed = false;
+        public QueryThread(OpenJPAEntityManager em, String jpql) {
+            super();
+            this.em = em;
+            this.jpql = jpql;
+        }
+        
+        public void run() {
+            try {
+                for (int i = 0; i < 10 && !failed; i++) {
+                    OpenJPAQuery q = em.createQuery(jpql);
+                    q.setParameter("name", "Author-"+i);
+                    q.getResultList();
+                    if (i > 1) 
+                        assertEquals(QueryLanguages.LANG_PREPARED_SQL, q.getLanguage());
+                }
+            } catch (Exception e) {
+                e.printStackTrace();
+                failed = true;
+            }
+        }
+        
+        public boolean isFailed() {
+            return failed;
+        }
+        
+    }
 
 }

Modified: openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java
URL: http://svn.apache.org/viewvc/openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java?rev=901845&r1=901844&r2=901845&view=diff
==============================================================================
--- openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java (original)
+++ openjpa/trunk/openjpa-persistence/src/main/java/org/apache/openjpa/persistence/EntityManagerImpl.java Thu Jan 21 20:17:50 2010
@@ -963,7 +963,7 @@
             String qid = query;
             PreparedQuery pq = JPQLParser.LANG_JPQL.equals(language)
                 ? getPreparedQuery(qid) : null;
-            org.apache.openjpa.kernel.Query q = (pq == null)
+            org.apache.openjpa.kernel.Query q = (pq == null || !pq.isInitialized())
                 ? _broker.newQuery(language, query)
                 : _broker.newQuery(pq.getLanguage(), pq);
             // have to validate JPQL according to spec
@@ -1003,7 +1003,7 @@
             
             PreparedQuery pq = JPQLParser.LANG_JPQL.equals(meta.getLanguage())
                 ? getPreparedQuery(qid) : null;
-            org.apache.openjpa.kernel.Query del = (pq == null)
+            org.apache.openjpa.kernel.Query del = (pq == null || !pq.isInitialized())
                 ? _broker.newQuery(meta.getLanguage(), meta.getQueryString())
                 : _broker.newQuery(pq.getLanguage(), pq);