Index: src/main/java/org/apache/jackrabbit/core/journal/DatabaseJournal.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/journal/DatabaseJournal.java (revision 1039151) +++ src/main/java/org/apache/jackrabbit/core/journal/DatabaseJournal.java (working copy) @@ -433,6 +433,32 @@ throw new JournalException("Unable to return record iterator.", e); } } + + /** + * Synchronize contents from journal. May be overridden by subclasses. + * Overrided to do it in batchMode, since some databases (PSQL) when + * not in transactional mode, load all results in memory which causes + * out of memory. + * + * @param startRevision start point (exclusive) + * @throws JournalException if an error occurs + */ + @Override + protected void doSync(long startRevision) throws JournalException { + try { + conHelper.startBatch(); + super.doSync(startRevision); + } catch (SQLException e) { + // Should throw journal exception instead of just logging it? + log.error("couldn't sync the cluster node", e); + } finally { + try { + conHelper.endBatch(true); + } catch (SQLException e) { + log.warn("couldn't close connection", e); + } + } + } /** * {@inheritDoc} Index: src/main/java/org/apache/jackrabbit/core/util/db/ConnectionHelper.java =================================================================== --- src/main/java/org/apache/jackrabbit/core/util/db/ConnectionHelper.java (revision 1039151) +++ src/main/java/org/apache/jackrabbit/core/util/db/ConnectionHelper.java (working copy) @@ -348,6 +348,7 @@ stmt = con.prepareStatement(sql); } stmt.setMaxRows(maxRows); + stmt.setFetchSize(10000); execute(stmt, params); if (returnGeneratedKeys) { rs = stmt.getGeneratedKeys();