diff --git a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java index 2845e0a..e906837 100644 --- a/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java +++ b/oak-core/src/main/java/org/apache/jackrabbit/oak/plugins/document/rdb/RDBDocumentStoreJDBC.java @@ -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; @@ -347,11 +346,12 @@ public class RDBDocumentStoreJDBC { Set successfulUpdates = new HashSet(); List updatedKeys = new ArrayList(); - 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) { @@ -385,9 +385,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(); @@ -403,49 +407,16 @@ public class RDBDocumentStoreJDBC { } if (upsert) { - List remainingDocuments = new ArrayList(documents.size() - successfulUpdates.size()); + List toBeInserted = new ArrayList(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 documentsWithUpdatedModcount = new HashSet(); - List remainingDocumentIds = Lists.transform(remainingDocuments, idExtractor); - for (List 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 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); } } }