From c8c801a6ce078825191f92323f3db9e308564443 Mon Sep 17 00:00:00 2001 From: brianjlowe Date: Mon, 21 Nov 2011 19:32:14 +0000 Subject: [PATCH] NIHVIVO-3196 suppression of additional unnecessary log messages related to connection timeout and associated improvements --- webapp/config/default.log4j.properties | 1 + .../vitro/webapp/dao/jena/GraphGenerator.java | 2 + ...zer.java => MemToDBModelSynchronizer.java} | 32 ++++++++------ .../webapp/dao/jena/RDBGraphGenerator.java | 10 ++++- .../webapp/dao/jena/RDBModelGenerator.java | 43 ------------------- .../webapp/dao/jena/RegeneratingGraph.java | 40 +++++++++++++++-- .../webapp/dao/jena/SDBGraphGenerator.java | 10 ++++- ...lGenerator.java => SQLGraphGenerator.java} | 8 ++-- .../webapp/dao/jena/VitroJenaModelMaker.java | 2 +- 9 files changed, 83 insertions(+), 65 deletions(-) rename webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/{MemToRDBModelSynchronizer.java => MemToDBModelSynchronizer.java} (68%) delete mode 100644 webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDBModelGenerator.java rename webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/{ModelGenerator.java => SQLGraphGenerator.java} (52%) diff --git a/webapp/config/default.log4j.properties b/webapp/config/default.log4j.properties index d7bc7e609..390be80e1 100644 --- a/webapp/config/default.log4j.properties +++ b/webapp/config/default.log4j.properties @@ -38,6 +38,7 @@ log4j.logger.edu.cornell.mannlib.vitro.webapp.controller.freemarker.BrowseContro log4j.logger.edu.cornell.mannlib.vitro.webapp.dao.jena.pellet.PelletListener=WARN log4j.logger.edu.cornell.mannlib.vitro.webapp.dao.jena.RDBGraphGenerator=WARN # suppress odd warnings from libraries +log4j.logger.com.hp.hpl.jena.sdb.layout2.LoaderTuplesNodes=FATAL log4j.logger.com.hp.hpl.jena.db.impl.PSet_TripleStore_RDB=FATAL log4j.logger.com.hp.hpl.jena.sdb.sql.SDBConnection=ERROR log4j.logger.org.openjena.riot=FATAL diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/GraphGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/GraphGenerator.java index c07cb5bb0..14ce6caf3 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/GraphGenerator.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/GraphGenerator.java @@ -8,4 +8,6 @@ public interface GraphGenerator { public Graph generateGraph(); + public boolean isGraphClosed(); + } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/MemToRDBModelSynchronizer.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/MemToDBModelSynchronizer.java similarity index 68% rename from webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/MemToRDBModelSynchronizer.java rename to webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/MemToDBModelSynchronizer.java index bc86ee503..de575b5be 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/MemToRDBModelSynchronizer.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/MemToDBModelSynchronizer.java @@ -11,22 +11,23 @@ import com.hp.hpl.jena.rdf.model.ModelFactory; import com.hp.hpl.jena.rdf.model.Statement; /** - * This listener will open and close RDB models as it performs edits to avoid + * This listener will open and close DB models as it performs edits to avoid * wasting DB connections * @author bjl23 * */ -public class MemToRDBModelSynchronizer extends StatementListener { +public class MemToDBModelSynchronizer extends StatementListener { - private static long IDLE_MILLIS = 2000; // how long to let a model site idle after an edit has been performed + private static long IDLE_MILLIS = 2000; // how long to let a model site idle + // after an edit has been performed - RDBGraphGenerator generator; + SQLGraphGenerator generator; Model model; boolean editInProgress; boolean cleanupThreadActive; long lastEditTimeMillis; - public MemToRDBModelSynchronizer(RDBGraphGenerator generator) { + public MemToDBModelSynchronizer(SQLGraphGenerator generator) { this.generator = generator; } @@ -49,7 +50,8 @@ public class MemToRDBModelSynchronizer extends StatementListener { lastEditTimeMillis = System.currentTimeMillis(); this.editInProgress = false; if (!cleanupThreadActive) { - (new Thread(new Cleanup(this), "MemToRDBModelSynchronizer")).start(); + (new Thread( + new Cleanup(this), "MemToDBModelSynchronizer")).start(); } } } @@ -63,33 +65,39 @@ public class MemToRDBModelSynchronizer extends StatementListener { lastEditTimeMillis = System.currentTimeMillis(); this.editInProgress = false; if (!cleanupThreadActive) { - (new Thread(new Cleanup(this), "MemToRDBModelSynchronizer")).start(); + (new Thread( + new Cleanup(this), "MemToDBModelSynchronizer")).start(); } } } private class Cleanup implements Runnable { - private MemToRDBModelSynchronizer s; + private MemToDBModelSynchronizer s; - public Cleanup(MemToRDBModelSynchronizer s) { + public Cleanup(MemToDBModelSynchronizer s) { this.s = s; } public void run() { s.cleanupThreadActive = true; - while( (s.editInProgress) || (System.currentTimeMillis() - s.lastEditTimeMillis < IDLE_MILLIS ) ) { + while( (s.editInProgress) + || (System.currentTimeMillis() + - s.lastEditTimeMillis < IDLE_MILLIS ) ) { try { Thread.currentThread().sleep(1000); } catch (InterruptedException e) { - throw new RuntimeException("Interrupted cleanup thread in " + this.getClass().getName(), e); + throw new RuntimeException( + "Interrupted cleanup thread in " + + this.getClass().getName(), e); } } if (s.model != null) { s.model.close(); s.model = null; } else { - throw new RuntimeException(this.getClass().getName()+"Model already null"); + throw new RuntimeException( + this.getClass().getName() + "Model already null"); } java.sql.Connection c = generator.getConnection(); try { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDBGraphGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDBGraphGenerator.java index b9ad8f624..2e955abd6 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDBGraphGenerator.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDBGraphGenerator.java @@ -17,7 +17,7 @@ import com.hp.hpl.jena.graph.Graph; -public class RDBGraphGenerator implements GraphGenerator { +public class RDBGraphGenerator implements SQLGraphGenerator { private static final Log log = LogFactory.getLog(RDBGraphGenerator.class.getName()); @@ -32,6 +32,14 @@ public class RDBGraphGenerator implements GraphGenerator { this.graphID = graphID; } + public boolean isGraphClosed() { + try { + return (connection == null || connection.isClosed()); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } + public Graph generateGraph() { log.info("Regenerate the graph."); try { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDBModelGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDBModelGenerator.java deleted file mode 100644 index 14e284741..000000000 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RDBModelGenerator.java +++ /dev/null @@ -1,43 +0,0 @@ -/* $This file is distributed under the terms of the license in /doc/license.txt$ */ - -package edu.cornell.mannlib.vitro.webapp.dao.jena; - -import com.hp.hpl.jena.db.DBConnection; -import com.hp.hpl.jena.db.IDBConnection; -import com.hp.hpl.jena.ontology.OntModel; -import com.hp.hpl.jena.ontology.OntModelSpec; -import com.hp.hpl.jena.rdf.model.Model; -import com.hp.hpl.jena.rdf.model.ModelFactory; -import com.hp.hpl.jena.rdf.model.ModelMaker; -import org.apache.commons.dbcp.BasicDataSource; - -import java.sql.SQLException; - -public class RDBModelGenerator implements ModelGenerator { - - private BasicDataSource ds = null; - private String dbTypeStr = null; - private String modelNameStr = null; - private OntModelSpec ontModelSpec = null; - - public RDBModelGenerator(BasicDataSource bds, String dbTypeStr, String modelNameStr, OntModelSpec ontModelSpec) { - this.ds = bds; - this.dbTypeStr = dbTypeStr; - this.modelNameStr = modelNameStr; - this.ontModelSpec = ontModelSpec; - } - - public OntModel generateModel() { - try { - IDBConnection conn = new DBConnection(ds.getConnection(), dbTypeStr); - ModelMaker maker = ModelFactory.createModelRDBMaker(conn); - Model model = maker.openModel(modelNameStr); - OntModel oModel = ModelFactory.createOntologyModel(ontModelSpec, model); - oModel.prepare(); - return oModel; - } catch (SQLException e) { - return null; - } - } - -} diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RegeneratingGraph.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RegeneratingGraph.java index c8575528c..3195685dd 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RegeneratingGraph.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/RegeneratingGraph.java @@ -2,6 +2,9 @@ package edu.cornell.mannlib.vitro.webapp.dao.jena; +import org.apache.commons.logging.Log; +import org.apache.commons.logging.LogFactory; + import com.hp.hpl.jena.graph.BulkUpdateHandler; import com.hp.hpl.jena.graph.Capabilities; import com.hp.hpl.jena.graph.Graph; @@ -22,6 +25,8 @@ import com.hp.hpl.jena.vocabulary.RDF; public class RegeneratingGraph implements Graph, Regenerable { + private final static Log log = LogFactory.getLog(RegeneratingGraph.class); + private GraphGenerator generator; private Graph g; @@ -37,10 +42,14 @@ public class RegeneratingGraph implements Graph, Regenerable { public void regenerate() { this.g = generator.generateGraph(); - } + } + /* + * a nonsense query that should never send back actual result data + */ private void sendTestQuery() { - this.g.contains(DAML_OIL.Thing.asNode(),RDF.type.asNode(),DAML_OIL.Thing.asNode()); + this.g.contains( + DAML_OIL.Thing.asNode(),RDF.type.asNode(),DAML_OIL.Thing.asNode()); } protected void finalize() { @@ -61,6 +70,7 @@ public class RegeneratingGraph implements Graph, Regenerable { public boolean contains(Triple arg0) { try { + regenerateIfClosed(); return g.contains(arg0); } catch (Exception e) { regenerate(); @@ -70,7 +80,8 @@ public class RegeneratingGraph implements Graph, Regenerable { public boolean contains(Node arg0, Node arg1, Node arg2) { try { - return g.contains(arg0, arg1, arg2); + regenerateIfClosed(); + return g.contains(arg0, arg1, arg2); } catch (Exception e) { regenerate(); return g.contains(arg0, arg1, arg2); @@ -79,6 +90,7 @@ public class RegeneratingGraph implements Graph, Regenerable { public void delete(Triple arg0) throws DeleteDeniedException { try { + regenerateIfClosed(); g.delete(arg0); } catch (Exception e) { regenerate(); @@ -88,6 +100,7 @@ public class RegeneratingGraph implements Graph, Regenerable { public boolean dependsOn(Graph arg0) { try { + regenerateIfClosed(); return g.dependsOn(arg0); } catch (Exception e) { regenerate(); @@ -97,6 +110,7 @@ public class RegeneratingGraph implements Graph, Regenerable { public ExtendedIterator find(TripleMatch arg0) { try { + regenerateIfClosed(); return g.find(arg0); } catch (Exception e) { regenerate(); @@ -106,6 +120,7 @@ public class RegeneratingGraph implements Graph, Regenerable { public ExtendedIterator find(Node arg0, Node arg1, Node arg2) { try { + regenerateIfClosed(); return g.find(arg0,arg1,arg2); } catch (Exception e) { regenerate(); @@ -115,6 +130,7 @@ public class RegeneratingGraph implements Graph, Regenerable { public BulkUpdateHandler getBulkUpdateHandler() { try { + regenerateIfClosed(); sendTestQuery(); return g.getBulkUpdateHandler(); } catch (Exception e) { @@ -125,6 +141,7 @@ public class RegeneratingGraph implements Graph, Regenerable { public Capabilities getCapabilities() { try { + regenerateIfClosed(); sendTestQuery(); return g.getCapabilities(); } catch (Exception e) { @@ -136,6 +153,7 @@ public class RegeneratingGraph implements Graph, Regenerable { public GraphEventManager getEventManager() { try { + regenerateIfClosed(); sendTestQuery(); return g.getEventManager(); } catch (Exception e) { @@ -147,6 +165,7 @@ public class RegeneratingGraph implements Graph, Regenerable { public PrefixMapping getPrefixMapping() { try { + regenerateIfClosed(); sendTestQuery(); return g.getPrefixMapping(); } catch (Exception e) { @@ -158,6 +177,7 @@ public class RegeneratingGraph implements Graph, Regenerable { public Reifier getReifier() { try { + regenerateIfClosed(); sendTestQuery(); return g.getReifier(); } catch (Exception e) { @@ -169,6 +189,7 @@ public class RegeneratingGraph implements Graph, Regenerable { public GraphStatisticsHandler getStatisticsHandler() { try { + regenerateIfClosed(); sendTestQuery(); return g.getStatisticsHandler(); } catch (Exception e) { @@ -180,6 +201,7 @@ public class RegeneratingGraph implements Graph, Regenerable { public TransactionHandler getTransactionHandler() { try { + regenerateIfClosed(); sendTestQuery(); return g.getTransactionHandler(); } catch (Exception e) { @@ -191,6 +213,7 @@ public class RegeneratingGraph implements Graph, Regenerable { public boolean isClosed() { try { + regenerateIfClosed(); return g.isClosed(); } catch (Exception e) { regenerate(); @@ -201,6 +224,7 @@ public class RegeneratingGraph implements Graph, Regenerable { public boolean isEmpty() { try { + regenerateIfClosed(); return g.isEmpty(); } catch (Exception e) { regenerate(); @@ -211,6 +235,7 @@ public class RegeneratingGraph implements Graph, Regenerable { public boolean isIsomorphicWith(Graph arg0) { try { + regenerateIfClosed(); return g.isIsomorphicWith(arg0); } catch (Exception e) { regenerate(); @@ -221,6 +246,7 @@ public class RegeneratingGraph implements Graph, Regenerable { public QueryHandler queryHandler() { try { + regenerateIfClosed(); sendTestQuery(); return g.queryHandler(); } catch (Exception e) { @@ -232,6 +258,7 @@ public class RegeneratingGraph implements Graph, Regenerable { public int size() { try { + regenerateIfClosed(); return g.size(); } catch (Exception e) { regenerate(); @@ -242,11 +269,18 @@ public class RegeneratingGraph implements Graph, Regenerable { public void add(Triple arg0) throws AddDeniedException { try { + regenerateIfClosed(); g.add(arg0); } catch (Exception e) { regenerate(); g.add(arg0); } } + + private void regenerateIfClosed() { + if (generator.isGraphClosed()) { + regenerate(); + } + } } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SDBGraphGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SDBGraphGenerator.java index 41e0f0c49..59f42fc92 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SDBGraphGenerator.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SDBGraphGenerator.java @@ -13,7 +13,7 @@ import com.hp.hpl.jena.sdb.StoreDesc; import java.sql.Connection; import java.sql.SQLException; -public class SDBGraphGenerator implements GraphGenerator { +public class SDBGraphGenerator implements SQLGraphGenerator { private static final Log log = LogFactory.getLog(SDBGraphGenerator.class.getName()); @@ -28,6 +28,14 @@ public class SDBGraphGenerator implements GraphGenerator { this.storeDesc = storeDesc; this.graphID = graphID; } + + public boolean isGraphClosed() { + try { + return (connection == null || connection.isClosed()); + } catch (SQLException e) { + throw new RuntimeException(e); + } + } public Graph generateGraph() { try { diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ModelGenerator.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SQLGraphGenerator.java similarity index 52% rename from webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ModelGenerator.java rename to webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SQLGraphGenerator.java index 2a64c5ccc..0018019af 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/ModelGenerator.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/SQLGraphGenerator.java @@ -2,10 +2,10 @@ package edu.cornell.mannlib.vitro.webapp.dao.jena; -import com.hp.hpl.jena.ontology.OntModel; +import java.sql.Connection; -public interface ModelGenerator { - - public OntModel generateModel(); +public interface SQLGraphGenerator extends GraphGenerator { + public Connection getConnection(); + } diff --git a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VitroJenaModelMaker.java b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VitroJenaModelMaker.java index 8dd7223a7..04522af87 100644 --- a/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VitroJenaModelMaker.java +++ b/webapp/src/edu/cornell/mannlib/vitro/webapp/dao/jena/VitroJenaModelMaker.java @@ -346,7 +346,7 @@ public class VitroJenaModelMaker implements ModelMaker { Graph g = gen.generateGraph(); Model m = ModelFactory.createModelForGraph(g); memCache.add(m); - memCache.register(new MemToRDBModelSynchronizer(gen)); + memCache.register(new MemToDBModelSynchronizer(gen)); m.close(); try { gen.getConnection().close();