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