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);
}
}
}