From f4b7669232bacc3b33db491da6a6b1cb746c95d0 Mon Sep 17 00:00:00 2001 From: buczekp <buczekp> Date: Wed, 16 Jun 2010 07:55:53 +0000 Subject: [PATCH] minor: improvements of code for handling batches SVN: 16540 --- .../db/search/DefaultFullTextIndexer.java | 9 +---- .../GenericDataSetTypeSlaveServerPlugin.java | 4 +-- .../GenericSampleTypeSlaveServerPlugin.java | 7 ++-- .../plugin/generic/server/GenericServer.java | 6 ++-- .../server/batch/BatchOperationExecutor.java | 34 +++++++++---------- 5 files changed, 24 insertions(+), 36 deletions(-) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/DefaultFullTextIndexer.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/DefaultFullTextIndexer.java index 828545ece13..7364db57578 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/DefaultFullTextIndexer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/search/DefaultFullTextIndexer.java @@ -129,14 +129,7 @@ final class DefaultFullTextIndexer implements IFullTextIndexer private int getNextIndex(int index, int maxIndex) { - int result = index + batchSize; - if (result < maxIndex) - { - return result; - } else - { - return maxIndex; - } + return Math.min(index + batchSize, maxIndex); } private static final FullTextSession getFullTextSession(final Session hibernateSession) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericDataSetTypeSlaveServerPlugin.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericDataSetTypeSlaveServerPlugin.java index f7081b17881..97df9049ff7 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericDataSetTypeSlaveServerPlugin.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericDataSetTypeSlaveServerPlugin.java @@ -39,8 +39,6 @@ import ch.systemsx.cisd.openbis.plugin.generic.shared.ResourceNames; @Component(ch.systemsx.cisd.openbis.generic.shared.ResourceNames.GENERIC_DATA_SET_TYPE_SLAVE_SERVER_PLUGIN) public class GenericDataSetTypeSlaveServerPlugin implements IDataSetTypeSlaveServerPlugin { - private static final int BATCH_SIZE = 1000; - @Resource(name = ResourceNames.GENERIC_BUSINESS_OBJECT_FACTORY) private IGenericBusinessObjectFactory businessObjectFactory; @@ -62,7 +60,7 @@ public class GenericDataSetTypeSlaveServerPlugin implements IDataSetTypeSlaveSer assert newDataSets != null && newDataSets.size() > 0 : "Unspecified data set or empty data sets."; new BatchOperationExecutor<NewDataSet>().executeInBatches(new DataSetBatchUpdate( - businessObjectFactory.createExternalDataTable(session), newDataSets), BATCH_SIZE); + businessObjectFactory.createExternalDataTable(session), newDataSets)); } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericSampleTypeSlaveServerPlugin.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericSampleTypeSlaveServerPlugin.java index b259533ed43..ccd7eb52b9d 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericSampleTypeSlaveServerPlugin.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericSampleTypeSlaveServerPlugin.java @@ -46,9 +46,6 @@ import ch.systemsx.cisd.openbis.plugin.generic.shared.ResourceNames; @Component(ch.systemsx.cisd.openbis.generic.shared.ResourceNames.GENERIC_SAMPLE_TYPE_SLAVE_SERVER_PLUGIN) public final class GenericSampleTypeSlaveServerPlugin implements ISampleTypeSlaveServerPlugin { - - private static final int BATCH_SIZE = 10000; - @Resource(name = ResourceNames.GENERIC_BUSINESS_OBJECT_FACTORY) private IGenericBusinessObjectFactory businessObjectFactory; @@ -83,7 +80,7 @@ public final class GenericSampleTypeSlaveServerPlugin implements ISampleTypeSlav assert newSamples != null && newSamples.size() > 0 : "Unspecified sample or empty samples."; new BatchOperationExecutor<NewSample>().executeInBatches(new SampleBatchRegistration( - businessObjectFactory.createSampleTable(session), newSamples), BATCH_SIZE); + businessObjectFactory.createSampleTable(session), newSamples)); } public void updateSamples(Session session, List<SampleBatchUpdatesDTO> updateSamples) @@ -92,6 +89,6 @@ public final class GenericSampleTypeSlaveServerPlugin implements ISampleTypeSlav assert updateSamples != null && updateSamples.size() > 0 : "Unspecified sample or empty samples."; new BatchOperationExecutor<SampleBatchUpdatesDTO>().executeInBatches(new SampleBatchUpdate( - businessObjectFactory.createSampleTable(session), updateSamples), BATCH_SIZE); + businessObjectFactory.createSampleTable(session), updateSamples)); } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java index 22fead76f04..c20671abbbf 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/GenericServer.java @@ -274,10 +274,10 @@ public final class GenericServer extends AbstractServer<IGenericServer> implemen registerSamples(session, samples); } else { - new BatchOperationExecutor<NewSample>().executeInBatches( - new SampleBatchRegisterOrUpdate(businessObjectFactory + new BatchOperationExecutor<NewSample>() + .executeInBatches(new SampleBatchRegisterOrUpdate(businessObjectFactory .createSampleLister(session), samples.getNewSamples(), samples - .getSampleType(), session), 1000); + .getSampleType(), session)); } } } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/batch/BatchOperationExecutor.java b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/batch/BatchOperationExecutor.java index 06353d2a647..dee516fadde 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/batch/BatchOperationExecutor.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/plugin/generic/server/batch/BatchOperationExecutor.java @@ -1,6 +1,5 @@ package ch.systemsx.cisd.openbis.plugin.generic.server.batch; -import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; @@ -9,7 +8,7 @@ import ch.systemsx.cisd.common.logging.LogCategory; import ch.systemsx.cisd.common.logging.LogFactory; /** - * Executes provided operation in batches of chosen size. + * Executes provided operation in batches of chosen size (by default 1000). * * @author Izabela Adamczyk */ @@ -18,27 +17,28 @@ public class BatchOperationExecutor<S> private static final Logger operationLog = LogFactory.getLogger(LogCategory.OPERATION, BatchOperationExecutor.class); + private static final int DEFAULT_BATCH_SIZE = 1000; + + public void executeInBatches(IBatchOperation<S> strategy) + { + executeInBatches(strategy, DEFAULT_BATCH_SIZE); + } + public void executeInBatches(IBatchOperation<S> strategy, int batchSize) { assert strategy != null : "Unspecified operation."; - List<S> batch = new ArrayList<S>(); - int counter = 0; - for (S entity : strategy.getAllEntities()) - { - batch.add(entity); - if (batch.size() >= batchSize) - { - strategy.execute(batch); - counter += batch.size(); - operationLog.info(String.format("%s %s progress: %d/%d", strategy.getEntityName(), - strategy.getOperationName(), counter, strategy.getAllEntities().size())); - batch.clear(); - } - } - if (batch.size() > 0) + final List<S> allEntities = strategy.getAllEntities(); + int startIndex = 0; + int maxIndex = allEntities.size(); + while (startIndex < maxIndex) { + final int endIndex = Math.min(startIndex + batchSize, maxIndex); + final List<S> batch = allEntities.subList(startIndex, endIndex); strategy.execute(batch); + operationLog.info(String.format("%s %s progress: %d/%d", strategy.getEntityName(), + strategy.getOperationName(), endIndex, maxIndex)); + startIndex += batchSize; } } } \ No newline at end of file -- GitLab