From a7958ce8dba2bb437a032d90fbe5ef2d6a6565f8 Mon Sep 17 00:00:00 2001 From: tpylak <tpylak> Date: Thu, 26 Aug 2010 12:17:44 +0000 Subject: [PATCH] SE-296 close EODSQL queries SVN: 17636 --- .../dss/etl/HCSImageDatasetLoaderFactory.java | 1 + .../server/TabularDataGraphServlet.java | 6 ++++ .../server/images/ImageChannelsUtils.java | 36 ++++++++++--------- ...mageAnalysisMergedRowsReportingPlugin.java | 13 +++++-- .../server/DssServiceRpcScreening.java | 33 ++++++++++++----- .../openbis/dss/shared/DssScreeningUtils.java | 20 ++++++++++- 6 files changed, 81 insertions(+), 28 deletions(-) diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/HCSImageDatasetLoaderFactory.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/HCSImageDatasetLoaderFactory.java index 33e1a0d7624..ca719c97512 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/HCSImageDatasetLoaderFactory.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/HCSImageDatasetLoaderFactory.java @@ -39,6 +39,7 @@ public class HCSImageDatasetLoaderFactory return factories; } + /** the loader has to be closed when it is not used any more to free database resources! */ public static final IHCSImageDatasetLoader create(File datasetRootDir, String datasetCode) { return createImageDBLoader(datasetRootDir, datasetCode); diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/TabularDataGraphServlet.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/TabularDataGraphServlet.java index 41330166b7f..9cff9157c5c 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/TabularDataGraphServlet.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/TabularDataGraphServlet.java @@ -162,6 +162,12 @@ public class TabularDataGraphServlet extends AbstractTabularDataGraphServlet return imagingDbDao; } + @Override + protected void finalize() + { + DssScreeningUtils.closeQuietly(imagingDbDao); + } + private IEncapsulatedOpenBISService getService() { synchronized (this) diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/images/ImageChannelsUtils.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/images/ImageChannelsUtils.java index e23282d2e1b..2f9d7a6a1fa 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/images/ImageChannelsUtils.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/images/ImageChannelsUtils.java @@ -52,28 +52,32 @@ public class ImageChannelsUtils { IHCSImageDatasetLoader imageAccessor = HCSImageDatasetLoaderFactory.create(datasetRoot, datasetCode); - List<AbsoluteImageReference> images = new ArrayList<AbsoluteImageReference>(); - - Size thumbnailSizeOrNull = params.tryGetThumbnailSize(); - if (params.isMergeAllChannels()) + try { - for (String chosenChannel : imageAccessor.getImageParameters().getChannelsCodes()) + List<AbsoluteImageReference> images = new ArrayList<AbsoluteImageReference>(); + + Size thumbnailSizeOrNull = params.tryGetThumbnailSize(); + if (params.isMergeAllChannels()) + { + for (String chosenChannel : imageAccessor.getImageParameters().getChannelsCodes()) + { + AbsoluteImageReference image = + getImage(imageAccessor, params.getChannelStack(), chosenChannel, + thumbnailSizeOrNull); + images.add(image); + } + } else { AbsoluteImageReference image = - getImage(imageAccessor, params.getChannelStack(), chosenChannel, + getImage(imageAccessor, params.getChannelStack(), params.getChannel(), thumbnailSizeOrNull); images.add(image); } - } else + return images; + } finally { - AbsoluteImageReference image = - getImage(imageAccessor, params.getChannelStack(), params.getChannel(), - thumbnailSizeOrNull); - images.add(image); + imageAccessor.close(); } - imageAccessor.close(); - - return images; } /** @@ -251,8 +255,8 @@ public class ImageChannelsUtils Size thumbnailSizeOrNull) { AbsoluteImageReference image = - imageAccessor - .tryGetImage(chosenChannelCode, channelStackReference, thumbnailSizeOrNull); + imageAccessor.tryGetImage(chosenChannelCode, channelStackReference, + thumbnailSizeOrNull); if (image != null) { return image; diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/ImageAnalysisMergedRowsReportingPlugin.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/ImageAnalysisMergedRowsReportingPlugin.java index cb9dc5c0e3d..07030a78058 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/ImageAnalysisMergedRowsReportingPlugin.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/ImageAnalysisMergedRowsReportingPlugin.java @@ -123,13 +123,22 @@ public class ImageAnalysisMergedRowsReportingPlugin extends AbstractDatastorePlu private IImagingQueryDAO getDAO() { - if (dao == null) + synchronized (this) { - dao = DssScreeningUtils.createQuery(); + if (dao == null) + { + dao = DssScreeningUtils.createQuery(); + } } return dao; } + @Override + protected void finalize() + { + DssScreeningUtils.closeQuietly(dao); + } + private IEncapsulatedOpenBISService getService() { if (service == null) diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java index df09fe0eb62..774415062c0 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/screening/server/DssServiceRpcScreening.java @@ -81,6 +81,7 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc implements */ public static final int MINOR_VERSION = 2; + // this dao will hold one connection to the database private IImagingQueryDAO dao; public DssServiceRpcScreening(String storeRootDir) @@ -168,13 +169,18 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc implements { IHCSImageDatasetLoader imageAccessor = HCSImageDatasetLoaderFactory.create(datasetRoot, dataset.getDatasetCode()); - IContent imageFile = getAnyImagePath(imageAccessor, dataset); - PlateImageParameters params = imageAccessor.getImageParameters(); - imageAccessor.close(); - int tilesNumber = params.getTileColsNum() * params.getTileRowsNum(); - BufferedImage image = ImageUtil.loadImage(imageFile.getInputStream()); - return new ImageDatasetMetadata(dataset, params.getChannelsCodes(), params - .getChannelsLabels(), tilesNumber, image.getWidth(), image.getHeight()); + try + { + IContent imageFile = getAnyImagePath(imageAccessor, dataset); + PlateImageParameters params = imageAccessor.getImageParameters(); + int tilesNumber = params.getTileColsNum() * params.getTileRowsNum(); + BufferedImage image = ImageUtil.loadImage(imageFile.getInputStream()); + return new ImageDatasetMetadata(dataset, params.getChannelsCodes(), params + .getChannelsLabels(), tilesNumber, image.getWidth(), image.getHeight()); + } finally + { + imageAccessor.close(); + } } private static IContent getAnyImagePath(IHCSImageDatasetLoader imageAccessor, @@ -468,13 +474,22 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc implements private IImagingQueryDAO getDAO() { - if (dao == null) + synchronized (this) { - dao = DssScreeningUtils.createQuery(); + if (dao == null) + { + dao = DssScreeningUtils.createQuery(); + } } return dao; } + @Override + protected void finalize() + { + DssScreeningUtils.closeQuietly(dao); + } + public int getMajorVersion() { return MAJOR_VERSION; diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/shared/DssScreeningUtils.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/shared/DssScreeningUtils.java index bfdd0ed0fc5..16790a0860e 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/dss/shared/DssScreeningUtils.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/shared/DssScreeningUtils.java @@ -26,7 +26,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.IImag /** * Utility methods for DSS. - * + * * @author Franz-Josef Elmer */ public class DssScreeningUtils @@ -34,6 +34,10 @@ public class DssScreeningUtils /** * Creates a DAO based on imaging database specified in DSS service.properties by data source * {@link ScreeningConstants#IMAGING_DATA_SOURCE}. + * <p> + * Query has to be closed as soon as it is not used, otherwise we will run out of available + * connections quickly! + * </p> */ public static IImagingQueryDAO createQuery() { @@ -43,4 +47,18 @@ public class DssScreeningUtils return QueryTool.getQuery(dataSource, IImagingQueryDAO.class); } + /** Closes the query if it is not null, ignores the exceptions */ + public static void closeQuietly(IImagingQueryDAO queryOrNull) + { + if (queryOrNull != null) + { + try + { + queryOrNull.close(); + } catch (RuntimeException ex) + { + } + } + } + } -- GitLab