From 88c75d3a4e3e37d7e38f428d26d082d83633973c Mon Sep 17 00:00:00 2001 From: buczekp <buczekp> Date: Thu, 11 Nov 2010 15:14:08 +0000 Subject: [PATCH] [LMS-1772] use cache of samples (reduces time spend on loading parents for 1000 samples with the same parent from 12s to <100ms) SVN: 18642 --- .../bo/AbstractSampleBusinessObject.java | 1 - ...bstractSampleIdentifierBusinessObject.java | 46 ++++++++++++------- 2 files changed, 30 insertions(+), 17 deletions(-) diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java index b59329d8cad..6782ed2b31e 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleBusinessObject.java @@ -214,7 +214,6 @@ abstract class AbstractSampleBusinessObject extends AbstractSampleIdentifierBusi final Set<SamplePE> parentPEs = new HashSet<SamplePE>(); for (SampleIdentifier si : parentIdentifiers) { - // TODO 2010-11-10, Piotr Buczek: use cache SamplePE parent = getSampleByIdentifier(si); parentPEs.add(parent); } diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleIdentifierBusinessObject.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleIdentifierBusinessObject.java index b504e0c0ffb..bc2e7eb3f84 100644 --- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleIdentifierBusinessObject.java +++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/business/bo/AbstractSampleIdentifierBusinessObject.java @@ -16,6 +16,9 @@ package ch.systemsx.cisd.openbis.generic.server.business.bo; +import java.util.HashMap; +import java.util.Map; + import ch.systemsx.cisd.common.exceptions.UserFailureException; import ch.systemsx.cisd.openbis.generic.server.business.bo.util.SampleOwner; import ch.systemsx.cisd.openbis.generic.server.business.bo.util.SampleOwnerFinder; @@ -35,6 +38,9 @@ import ch.systemsx.cisd.openbis.generic.shared.util.HibernateUtils; */ abstract class AbstractSampleIdentifierBusinessObject extends AbstractBusinessObject { + private final Map<SampleIdentifier, SamplePE> sampleByIdentifierCache = + new HashMap<SampleIdentifier, SamplePE>(); + private final SampleOwnerFinder sampleOwnerFinder; AbstractSampleIdentifierBusinessObject(final IDAOFactory daoFactory, final Session session) @@ -70,27 +76,35 @@ abstract class AbstractSampleIdentifierBusinessObject extends AbstractBusinessOb protected SamplePE tryToGetSampleByIdentifier(final SampleIdentifier sampleIdentifier) { - // TODO 2010-11-10, Piotr Buczek: use cache assert sampleIdentifier != null : "Sample identifier unspecified."; - final SampleOwner sampleOwner = sampleOwnerFinder.figureSampleOwner(sampleIdentifier); - final String sampleCode = sampleIdentifier.getSampleCode(); - final ISampleDAO sampleDAO = getSampleDAO(); - final SamplePE sample; - if (sampleOwner.isDatabaseInstanceLevel()) + + final SamplePE cachedResult = sampleByIdentifierCache.get(sampleIdentifier); + if (cachedResult != null) { - sample = - sampleDAO.tryFindByCodeAndDatabaseInstance(sampleCode, - sampleOwner.tryGetDatabaseInstance()); + return cachedResult; } else { - assert sampleOwner.isGroupLevel() : "Must be of space level."; - sample = sampleDAO.tryFindByCodeAndGroup(sampleCode, sampleOwner.tryGetGroup()); + final SampleOwner sampleOwner = sampleOwnerFinder.figureSampleOwner(sampleIdentifier); + final String sampleCode = sampleIdentifier.getSampleCode(); + final ISampleDAO sampleDAO = getSampleDAO(); + final SamplePE result; + if (sampleOwner.isDatabaseInstanceLevel()) + { + result = + sampleDAO.tryFindByCodeAndDatabaseInstance(sampleCode, + sampleOwner.tryGetDatabaseInstance()); + } else + { + assert sampleOwner.isGroupLevel() : "Must be of space level."; + result = sampleDAO.tryFindByCodeAndGroup(sampleCode, sampleOwner.tryGetGroup()); + } + if (result != null) + { + HibernateUtils.initialize(result.getExperiment()); + sampleByIdentifierCache.put(sampleIdentifier, result); + } + return result; } - if (sample != null) - { - HibernateUtils.initialize(sample.getExperiment()); - } - return sample; } /** -- GitLab