From e3e7e1ebd66efda95f689ce8a22638d4a1c7134f Mon Sep 17 00:00:00 2001 From: bjl23 Date: Fri, 10 Dec 2010 15:57:10 +0000 Subject: [PATCH] preventing reuse of closed jdbc connections in dao factories stored in context --- .../vitro/webapp/dao/jena/DatasetWrapper.java | 5 ++ .../webapp/dao/jena/WebappDaoFactorySDB.java | 66 +++++++++++++++++-- .../servlet/setup/JenaDataSourceSetupSDB.java | 12 ++-- 3 files changed, 73 insertions(+), 10 deletions(-) diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DatasetWrapper.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DatasetWrapper.java index 3f562ee78..897cef7d2 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DatasetWrapper.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/DatasetWrapper.java @@ -15,6 +15,11 @@ public class DatasetWrapper { this.dataset = dataset; } + public DatasetWrapper(Dataset dataset, SDBConnection conn) { + this.dataset = dataset; + this.conn = conn; + } + public Dataset getDataset() { if (!closed) { return dataset; diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/WebappDaoFactorySDB.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/WebappDaoFactorySDB.java index e450cfa13..c0693c6c5 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/WebappDaoFactorySDB.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/WebappDaoFactorySDB.java @@ -2,9 +2,17 @@ package edu.cornell.mannlib.vitro.webapp.dao.jena; +import java.sql.Connection; +import java.sql.SQLException; import java.util.HashSet; +import org.apache.commons.dbcp.BasicDataSource; + import com.hp.hpl.jena.query.Dataset; +import com.hp.hpl.jena.sdb.SDBFactory; +import com.hp.hpl.jena.sdb.Store; +import com.hp.hpl.jena.sdb.StoreDesc; +import com.hp.hpl.jena.sdb.sql.SDBConnection; import edu.cornell.mannlib.vitro.webapp.dao.DataPropertyStatementDao; import edu.cornell.mannlib.vitro.webapp.dao.IndividualDao; @@ -32,11 +40,31 @@ public class WebappDaoFactorySDB extends WebappDaoFactoryJena { * @param ontModelSelector * @param dataset */ - public WebappDaoFactorySDB(OntModelSelector ontModelSelector, Dataset dataset, String defaultNamespace, HashSet nonuserNamespaces, String[] preferredLanguages) { + public WebappDaoFactorySDB(OntModelSelector ontModelSelector, + Dataset dataset, + String defaultNamespace, + HashSet nonuserNamespaces, + String[] preferredLanguages) { super(ontModelSelector, defaultNamespace, nonuserNamespaces, preferredLanguages); this.dwf = new StaticDatasetFactory(dataset); } + /** + * For use when any Dataset access should get a temporary DB connection + * from a pool + * @param ontModelSelector + * @param dataset + */ + public WebappDaoFactorySDB(OntModelSelector ontModelSelector, + BasicDataSource bds, + StoreDesc storeDesc, + String defaultNamespace, + HashSet nonuserNamespaces, + String[] preferredLanguages) { + super(ontModelSelector, defaultNamespace, nonuserNamespaces, preferredLanguages); + this.dwf = new ReconnectingDatasetFactory(bds, storeDesc); + } + @Override public IndividualDao getIndividualDao() { if (entityWebappDao != null) @@ -71,14 +99,44 @@ public class WebappDaoFactorySDB extends WebappDaoFactoryJena { private class StaticDatasetFactory implements DatasetWrapperFactory { - private Dataset dataset; + private Dataset _dataset; public StaticDatasetFactory (Dataset dataset) { - this.dataset = dataset; + _dataset = dataset; } public DatasetWrapper getDatasetWrapper() { - return new DatasetWrapper(dataset); + return new DatasetWrapper(_dataset); + } + + } + + private class ReconnectingDatasetFactory implements DatasetWrapperFactory { + + private BasicDataSource _bds; + private StoreDesc _storeDesc; + private Dataset _dataset; + private Connection _conn; + + public ReconnectingDatasetFactory(BasicDataSource bds, StoreDesc storeDesc) { + _bds = bds; + _storeDesc = storeDesc; + } + + public DatasetWrapper getDatasetWrapper() { + try { + if ((_dataset != null) && (_conn != null) && (!_conn.isClosed())) { + return new DatasetWrapper(_dataset); + } else { + _conn = _bds.getConnection(); + SDBConnection conn = new SDBConnection(_conn) ; + Store store = SDBFactory.connectStore(conn, _storeDesc); + _dataset = SDBFactory.connectDataset(store); + return new DatasetWrapper(_dataset); + } + } catch (SQLException sqe) { + throw new RuntimeException("Unable to connect to database", sqe); + } } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupSDB.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupSDB.java index aaf374e62..ef90a6af8 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupSDB.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/servlet/setup/JenaDataSourceSetupSDB.java @@ -225,20 +225,20 @@ public class JenaDataSourceSetupSDB extends JenaDataSourceSetupBase implements j //log.info("Test query returned " + qe.execConstruct().size() + " statements"); sce.getServletContext().setAttribute("baseOntModel", memModel); - WebappDaoFactory baseWadf = new WebappDaoFactorySDB(baseOms, dataset, defaultNamespace, null, null); - //WebappDaoFactory baseWadf = new WebappDaoFactoryJena(baseOms, defaultNamespace, null, null); + WebappDaoFactory baseWadf = new WebappDaoFactorySDB(baseOms, bds, storeDesc, defaultNamespace, null, null); + //WebappDaoFactory baseWadf = new WebappDaoFactorySDB(baseOms, dataset, defaultNamespace, null, null); sce.getServletContext().setAttribute("assertionsWebappDaoFactory",baseWadf); sce.getServletContext().setAttribute("inferenceOntModel", inferenceModel); - WebappDaoFactory infWadf = new WebappDaoFactorySDB(inferenceOms, dataset, defaultNamespace, null, null); - //WebappDaoFactory infWadf = new WebappDaoFactoryJena(inferenceOms, defaultNamespace, null, null); + WebappDaoFactory infWadf = new WebappDaoFactorySDB(inferenceOms, bds, storeDesc, defaultNamespace, null, null); + //WebappDaoFactory infWadf = new WebappDaoFactorySDB(inferenceOms, dataset, defaultNamespace, null, null); sce.getServletContext().setAttribute("deductionsWebappDaoFactory", infWadf); OntModel masterUnion = ModelFactory.createOntologyModel(OntModelSpec.OWL_MEM, ModelFactory.createUnion(unionABoxModel, unionTBoxModel)); sce.getServletContext().setAttribute("jenaOntModel", masterUnion); - WebappDaoFactory wadf = new WebappDaoFactorySDB(unionOms, dataset, defaultNamespace, null, null); - //WebappDaoFactory wadf = new WebappDaoFactoryJena(unionOms, defaultNamespace, null, null); + WebappDaoFactory wadf = new WebappDaoFactorySDB(unionOms, bds, storeDesc, defaultNamespace, null, null); + //WebappDaoFactory wadf = new WebappDaoFactorySDB(unionOms, dataset, defaultNamespace, null, null); sce.getServletContext().setAttribute("webappDaoFactory",wadf); sce.getServletContext().setAttribute("unionOntModelSelector", unionOms); //assertions and inferences