You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@cayenne.apache.org by aa...@apache.org on 2007/06/23 09:37:41 UTC

svn commit: r550020 - /cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/IncrementalFaultList.java

Author: aadamchik
Date: Sat Jun 23 00:37:41 2007
New Revision: 550020

URL: http://svn.apache.org/viewvc?view=rev&rev=550020
Log:
CAY-810 IncrementalFaultList performance improvements
removing synchronization on elements array from fillIn method.

Modified:
    cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/IncrementalFaultList.java

Modified: cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/IncrementalFaultList.java
URL: http://svn.apache.org/viewvc/cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/IncrementalFaultList.java?view=diff&rev=550020&r1=550019&r2=550020
==============================================================================
--- cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/IncrementalFaultList.java (original)
+++ cayenne/main/trunk/framework/cayenne-jdk1.4-unpublished/src/main/java/org/apache/cayenne/access/IncrementalFaultList.java Sat Jun 23 00:37:41 2007
@@ -118,7 +118,6 @@
                             + metadata.getPageSize());
         }
 
-        this.elements = Collections.synchronizedList(new ArrayList());
         this.dataContext = dataContext;
         this.pageSize = metadata.getPageSize();
         this.rootEntity = metadata.getObjEntity();
@@ -153,9 +152,11 @@
             }
         }
 
-        fillIn(query);
+        List elementsUnsynced = new ArrayList();
+        fillIn(query, elementsUnsynced);
+        this.elements = Collections.synchronizedList(elementsUnsynced);
     }
-    
+
     /**
      * @since 1.2
      */
@@ -176,75 +177,84 @@
      * Performs initialization of the internal list of objects. Only the first page is
      * fully resolved. For the rest of the list, only ObjectIds are read.
      * 
+     * @deprecated since 3.0 this method is not called and is deprecated in favor of
+     *             {@link #fillIn(Query, List)}, as this method performed unneeded
+     *             synchronization.
      * @since 1.0.6
      */
     protected void fillIn(Query query) {
-        QueryMetadata info = query.getMetaData(dataContext.getEntityResolver());
-
         synchronized (elements) {
+            fillIn(query, elements);
+        }
+    }
 
-            boolean fetchesDataRows = internalQuery.isFetchingDataRows();
-
-            // start fresh
-            elements.clear();
-            rowWidth = 0;
+    /**
+     * Performs initialization of the list of objects. Only the first page is fully
+     * resolved. For the rest of the list, only ObjectIds are read.
+     * 
+     * @since 3.0
+     */
+    protected void fillIn(Query query, List elementsList) {
+        QueryMetadata info = query.getMetaData(dataContext.getEntityResolver());
+        boolean fetchesDataRows = internalQuery.isFetchingDataRows();
 
+        // start fresh
+        elementsList.clear();
+        rowWidth = 0;
+
+        try {
+            int lastResolved = 0;
+            long t1 = System.currentTimeMillis();
+            ResultIterator it = dataContext.performIteratedQuery(query);
             try {
-                int lastResolved = 0;
-                long t1 = System.currentTimeMillis();
-                ResultIterator it = dataContext.performIteratedQuery(query);
-                try {
-
-                    rowWidth = it.getDataRowWidth();
-
-                    // resolve first page if we can
-                    if (resolvesFirstPage()) {
-                        // read first page completely, the rest as ObjectIds
-                        for (int i = 0; i < pageSize && it.hasNextRow(); i++) {
-                            elements.add(it.nextDataRow());
-                            lastResolved++;
-                        }
 
-                        // defer DataRows -> Objects conversion till we are completely done.
-                    }
+                rowWidth = it.getDataRowWidth();
 
-                    // continue reading ids
-                    DbEntity entity = rootEntity.getDbEntity();
-                    while (it.hasNextRow()) {
-                        elements.add(it.nextObjectId(entity));
+                // resolve first page if we can
+                if (resolvesFirstPage()) {
+                    // read first page completely, the rest as ObjectIds
+                    for (int i = 0; i < pageSize && it.hasNextRow(); i++) {
+                        elementsList.add(it.nextDataRow());
+                        lastResolved++;
                     }
 
-                    QueryLogger.logSelectCount(elements.size(), System
-                            .currentTimeMillis()
-                            - t1);
-                }
-                finally {
-                    it.close();
+                    // defer DataRows -> Objects conversion till we are completely done.
                 }
-                
-                // fill in the first page AFTER the iterator was closed, otherwise we may
-                // cause an (unobvious) deadlock due to connection pool exhaustion 
-                if (!fetchesDataRows && lastResolved > 0) {
-                    List objects = dataContext.objectsFromDataRows(
-                            rootEntity,
-                            elements.subList(0, lastResolved),
-                            info.isRefreshingObjects(),
-                            info.isResolvingInherited());
-                    
-                    for(int i = 0; i < lastResolved; i++) {
-                        elements.set(i, objects.get(i));
-                    }
+
+                // continue reading ids
+                DbEntity entity = rootEntity.getDbEntity();
+                while (it.hasNextRow()) {
+                    elementsList.add(it.nextObjectId(entity));
                 }
+
+                QueryLogger.logSelectCount(elementsList.size(), System
+                        .currentTimeMillis()
+                        - t1);
             }
-            catch (CayenneException e) {
-                throw new CayenneRuntimeException("Error performing query.", Util
-                        .unwindException(e));
+            finally {
+                it.close();
             }
 
-            unfetchedObjects = (resolvesFirstPage())
-                    ? elements.size() - pageSize
-                    : elements.size();
+            // fill in the first page AFTER the iterator was closed, otherwise we may
+            // cause an (unobvious) deadlock due to connection pool exhaustion
+            if (!fetchesDataRows && lastResolved > 0) {
+                List objects = dataContext.objectsFromDataRows(rootEntity, elementsList
+                        .subList(0, lastResolved), info.isRefreshingObjects(), info
+                        .isResolvingInherited());
+
+                for (int i = 0; i < lastResolved; i++) {
+                    elementsList.set(i, objects.get(i));
+                }
+            }
         }
+        catch (CayenneException e) {
+            throw new CayenneRuntimeException("Error performing query.", Util
+                    .unwindException(e));
+        }
+
+        unfetchedObjects = (resolvesFirstPage())
+                ? elementsList.size() - pageSize
+                : elementsList.size();
     }
 
     /**