You are viewing a plain text version of this content. The canonical link for it is here.
Posted to oak-commits@jackrabbit.apache.org by re...@apache.org on 2016/05/10 13:12:26 UTC

svn commit: r1743171 - in /jackrabbit/oak/branches/1.4: ./ oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java

Author: reschke
Date: Tue May 10 13:12:26 2016
New Revision: 1743171

URL: http://svn.apache.org/viewvc?rev=1743171&view=rev
Log:
OAK-4029: RDBDocumentStore: optimize the bulk update method (ported to 1.4)

Modified:
    jackrabbit/oak/branches/1.4/   (props changed)
    jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java

Propchange: jackrabbit/oak/branches/1.4/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue May 10 13:12:26 2016
@@ -1,3 +1,3 @@
 /jackrabbit/oak/branches/1.0:1665962
-/jackrabbit/oak/trunk:1733615,1733875,1733913,1733929,1734230,1734254,1734279,1735052,1735405,1735484,1735549,1735564,1735622,1735638,1735919,1735983,1736176,1737309-1737310,1737998,1738004,1738775,1738963,1739894,1740971,1741032,1741339,1741343,1742520,1742888,1742916,1743097
+/jackrabbit/oak/trunk:1733615,1733875,1733913,1733929,1734230,1734254,1734279,1734941,1735052,1735405,1735484,1735549,1735564,1735622,1735638,1735919,1735983,1736176,1737309-1737310,1737998,1738004,1738775,1738963,1739894,1740971,1741032,1741339,1741343,1742520,1742888,1742916,1743097
 /jackrabbit/trunk:1345480

Modified: jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java
URL: http://svn.apache.org/viewvc/jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java?rev=1743171&r1=1743170&r2=1743171&view=diff
==============================================================================
--- jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java (original)
+++ jackrabbit/oak/branches/1.4/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java Tue May 10 13:12:26 2016
@@ -37,7 +37,6 @@ import java.util.Collections;
 import java.util.Comparator;
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -343,11 +342,12 @@ public class RDBDocumentStoreJDBC {
 
         Set<String> successfulUpdates = new HashSet<String>();
         List<String> updatedKeys = new ArrayList<String>();
-        int[] batchResults;
+        int[] batchResults = new int[0];
 
         PreparedStatement stmt = connection.prepareStatement("update " + tmd.getName()
             + " set MODIFIED = ?, HASBINARY = ?, DELETEDONCE = ?, MODCOUNT = ?, CMODCOUNT = ?, DSIZE = ?, DATA = ?, BDATA = ? where ID = ? and MODCOUNT = ?");
         try {
+            boolean batchIsEmpty = true;
             for (T document : sortDocuments(documents)) {
                 Long modcount = (Long) document.get(MODCOUNT);
                 if (modcount == 1) {
@@ -381,9 +381,13 @@ public class RDBDocumentStoreJDBC {
                 stmt.setObject(si++, modcount - 1, Types.BIGINT);
                 stmt.addBatch();
                 updatedKeys.add(document.getId());
+
+                batchIsEmpty = false;
+            }
+            if (!batchIsEmpty) {
+                batchResults = stmt.executeBatch();
+                connection.commit();
             }
-            batchResults = stmt.executeBatch();
-            connection.commit();
         } catch (BatchUpdateException ex) {
             LOG.debug("Some of the batch updates failed", ex);
             batchResults = ex.getUpdateCounts();
@@ -399,49 +403,16 @@ public class RDBDocumentStoreJDBC {
         }
 
         if (upsert) {
-            List<T> remainingDocuments = new ArrayList<T>(documents.size() - successfulUpdates.size());
+            List<T> toBeInserted = new ArrayList<T>(documents.size());
             for (T doc : documents) {
-                if (!successfulUpdates.contains(doc.getId())) {
-                    remainingDocuments.add(doc);
+                if ((Long) doc.get(MODCOUNT) == 1) {
+                    toBeInserted.add(doc);
                 }
             }
 
-            if (!remainingDocuments.isEmpty()) {
-                Set<String> documentsWithUpdatedModcount = new HashSet<String>();
-                List<String> remainingDocumentIds = Lists.transform(remainingDocuments, idExtractor);
-                for (List<String> keys : Lists.partition(remainingDocumentIds, RDBJDBCTools.MAX_IN_CLAUSE)) {
-                    PreparedStatementComponent inClause = RDBJDBCTools.createInStatement("ID", keys, tmd.isIdBinary());
-                    StringBuilder sql = new StringBuilder("select ID from ").append(tmd.getName());
-                    sql.append(" where ").append(inClause.getStatementComponent());
-
-                    PreparedStatement selectStmt = null;
-                    ResultSet rs = null;
-                    try {
-                        selectStmt = connection.prepareStatement(sql.toString());
-                        selectStmt.setPoolable(false);
-                        inClause.setParameters(selectStmt, 1);
-                        rs = selectStmt.executeQuery();
-                        while (rs.next()) {
-                            documentsWithUpdatedModcount.add(getIdFromRS(tmd, rs, 1));
-                        }
-                        connection.commit();
-                    } finally {
-                        closeResultSet(rs);
-                        closeStatement(selectStmt);
-                    }
-                }
-
-                Iterator<T> it = remainingDocuments.iterator();
-                while (it.hasNext()) {
-                    if (documentsWithUpdatedModcount.contains(it.next().getId())) {
-                        it.remove();
-                    }
-                }
-
-                if (!remainingDocuments.isEmpty()) {
-                    for (String id : insert(connection, tmd, remainingDocuments)) {
-                        successfulUpdates.add(id);
-                    }
+            if (!toBeInserted.isEmpty()) {
+                for (String id : insert(connection, tmd, toBeInserted)) {
+                    successfulUpdates.add(id);
                 }
             }
         }