Skip to content
Snippets Groups Projects
Commit a7958ce8 authored by tpylak's avatar tpylak
Browse files

SE-296 close EODSQL queries

SVN: 17636
parent 3c9dc028
No related branches found
No related tags found
No related merge requests found
...@@ -39,6 +39,7 @@ public class HCSImageDatasetLoaderFactory ...@@ -39,6 +39,7 @@ public class HCSImageDatasetLoaderFactory
return factories; 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) public static final IHCSImageDatasetLoader create(File datasetRootDir, String datasetCode)
{ {
return createImageDBLoader(datasetRootDir, datasetCode); return createImageDBLoader(datasetRootDir, datasetCode);
......
...@@ -162,6 +162,12 @@ public class TabularDataGraphServlet extends AbstractTabularDataGraphServlet ...@@ -162,6 +162,12 @@ public class TabularDataGraphServlet extends AbstractTabularDataGraphServlet
return imagingDbDao; return imagingDbDao;
} }
@Override
protected void finalize()
{
DssScreeningUtils.closeQuietly(imagingDbDao);
}
private IEncapsulatedOpenBISService getService() private IEncapsulatedOpenBISService getService()
{ {
synchronized (this) synchronized (this)
......
...@@ -52,28 +52,32 @@ public class ImageChannelsUtils ...@@ -52,28 +52,32 @@ public class ImageChannelsUtils
{ {
IHCSImageDatasetLoader imageAccessor = IHCSImageDatasetLoader imageAccessor =
HCSImageDatasetLoaderFactory.create(datasetRoot, datasetCode); HCSImageDatasetLoaderFactory.create(datasetRoot, datasetCode);
List<AbsoluteImageReference> images = new ArrayList<AbsoluteImageReference>(); try
Size thumbnailSizeOrNull = params.tryGetThumbnailSize();
if (params.isMergeAllChannels())
{ {
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 = AbsoluteImageReference image =
getImage(imageAccessor, params.getChannelStack(), chosenChannel, getImage(imageAccessor, params.getChannelStack(), params.getChannel(),
thumbnailSizeOrNull); thumbnailSizeOrNull);
images.add(image); images.add(image);
} }
} else return images;
} finally
{ {
AbsoluteImageReference image = imageAccessor.close();
getImage(imageAccessor, params.getChannelStack(), params.getChannel(),
thumbnailSizeOrNull);
images.add(image);
} }
imageAccessor.close();
return images;
} }
/** /**
...@@ -251,8 +255,8 @@ public class ImageChannelsUtils ...@@ -251,8 +255,8 @@ public class ImageChannelsUtils
Size thumbnailSizeOrNull) Size thumbnailSizeOrNull)
{ {
AbsoluteImageReference image = AbsoluteImageReference image =
imageAccessor imageAccessor.tryGetImage(chosenChannelCode, channelStackReference,
.tryGetImage(chosenChannelCode, channelStackReference, thumbnailSizeOrNull); thumbnailSizeOrNull);
if (image != null) if (image != null)
{ {
return image; return image;
......
...@@ -123,13 +123,22 @@ public class ImageAnalysisMergedRowsReportingPlugin extends AbstractDatastorePlu ...@@ -123,13 +123,22 @@ public class ImageAnalysisMergedRowsReportingPlugin extends AbstractDatastorePlu
private IImagingQueryDAO getDAO() private IImagingQueryDAO getDAO()
{ {
if (dao == null) synchronized (this)
{ {
dao = DssScreeningUtils.createQuery(); if (dao == null)
{
dao = DssScreeningUtils.createQuery();
}
} }
return dao; return dao;
} }
@Override
protected void finalize()
{
DssScreeningUtils.closeQuietly(dao);
}
private IEncapsulatedOpenBISService getService() private IEncapsulatedOpenBISService getService()
{ {
if (service == null) if (service == null)
......
...@@ -81,6 +81,7 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc implements ...@@ -81,6 +81,7 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc implements
*/ */
public static final int MINOR_VERSION = 2; public static final int MINOR_VERSION = 2;
// this dao will hold one connection to the database
private IImagingQueryDAO dao; private IImagingQueryDAO dao;
public DssServiceRpcScreening(String storeRootDir) public DssServiceRpcScreening(String storeRootDir)
...@@ -168,13 +169,18 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc implements ...@@ -168,13 +169,18 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc implements
{ {
IHCSImageDatasetLoader imageAccessor = IHCSImageDatasetLoader imageAccessor =
HCSImageDatasetLoaderFactory.create(datasetRoot, dataset.getDatasetCode()); HCSImageDatasetLoaderFactory.create(datasetRoot, dataset.getDatasetCode());
IContent imageFile = getAnyImagePath(imageAccessor, dataset); try
PlateImageParameters params = imageAccessor.getImageParameters(); {
imageAccessor.close(); IContent imageFile = getAnyImagePath(imageAccessor, dataset);
int tilesNumber = params.getTileColsNum() * params.getTileRowsNum(); PlateImageParameters params = imageAccessor.getImageParameters();
BufferedImage image = ImageUtil.loadImage(imageFile.getInputStream()); int tilesNumber = params.getTileColsNum() * params.getTileRowsNum();
return new ImageDatasetMetadata(dataset, params.getChannelsCodes(), params BufferedImage image = ImageUtil.loadImage(imageFile.getInputStream());
.getChannelsLabels(), tilesNumber, image.getWidth(), image.getHeight()); return new ImageDatasetMetadata(dataset, params.getChannelsCodes(), params
.getChannelsLabels(), tilesNumber, image.getWidth(), image.getHeight());
} finally
{
imageAccessor.close();
}
} }
private static IContent getAnyImagePath(IHCSImageDatasetLoader imageAccessor, private static IContent getAnyImagePath(IHCSImageDatasetLoader imageAccessor,
...@@ -468,13 +474,22 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc implements ...@@ -468,13 +474,22 @@ public class DssServiceRpcScreening extends AbstractDssServiceRpc implements
private IImagingQueryDAO getDAO() private IImagingQueryDAO getDAO()
{ {
if (dao == null) synchronized (this)
{ {
dao = DssScreeningUtils.createQuery(); if (dao == null)
{
dao = DssScreeningUtils.createQuery();
}
} }
return dao; return dao;
} }
@Override
protected void finalize()
{
DssScreeningUtils.closeQuietly(dao);
}
public int getMajorVersion() public int getMajorVersion()
{ {
return MAJOR_VERSION; return MAJOR_VERSION;
......
...@@ -26,7 +26,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.IImag ...@@ -26,7 +26,7 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.IImag
/** /**
* Utility methods for DSS. * Utility methods for DSS.
* *
* @author Franz-Josef Elmer * @author Franz-Josef Elmer
*/ */
public class DssScreeningUtils public class DssScreeningUtils
...@@ -34,6 +34,10 @@ 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 * Creates a DAO based on imaging database specified in DSS service.properties by data source
* {@link ScreeningConstants#IMAGING_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() public static IImagingQueryDAO createQuery()
{ {
...@@ -43,4 +47,18 @@ public class DssScreeningUtils ...@@ -43,4 +47,18 @@ public class DssScreeningUtils
return QueryTool.getQuery(dataSource, IImagingQueryDAO.class); 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)
{
}
}
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment