From 107c2bff032acf8833e6090f4281e80e539dfa5d Mon Sep 17 00:00:00 2001 From: Graham Triggs Date: Wed, 11 Oct 2017 19:37:07 +0100 Subject: [PATCH] [VIVO-1399] Improve performance of Graph URI lookups --- .../rdfservice/impl/jena/RDFServiceJena.java | 35 +++++++++++++------ .../impl/jena/sdb/RDFServiceSDB.java | 1 + .../impl/jena/tdb/RDFServiceTDB.java | 2 ++ .../impl/sparql/RDFServiceSparql.java | 4 +-- 4 files changed, 29 insertions(+), 13 deletions(-) diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/RDFServiceJena.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/RDFServiceJena.java index 634269099..582c4f918 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/RDFServiceJena.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/RDFServiceJena.java @@ -60,7 +60,10 @@ public abstract class RDFServiceJena extends RDFServiceImpl implements RDFServic private final static Log log = LogFactory.getLog(RDFServiceJena.class); protected abstract DatasetWrapper getDatasetWrapper(); - + + protected volatile boolean rebuildGraphURICache = true; + private final List graphURIs = new ArrayList<>(); + @Override public abstract boolean changeSetUpdate(ChangeSet changeSet) throws RDFServiceException; @@ -527,18 +530,28 @@ public abstract class RDFServiceJena extends RDFServiceImpl implements RDFServic @Override public List getGraphURIs() throws RDFServiceException { - DatasetWrapper dw = getDatasetWrapper(); - try { - Dataset d = dw.getDataset(); - List graphURIs = new ArrayList(); - Iterator nameIt = d.listNames(); - while (nameIt.hasNext()) { - graphURIs.add(nameIt.next()); + if (rebuildGraphURICache) { + synchronized (RDFServiceJena.class) { + if (rebuildGraphURICache) { + rebuildGraphURICache = false; + graphURIs.clear(); + + DatasetWrapper dw = getDatasetWrapper(); + try { + Dataset d = dw.getDataset(); + Iterator nameIt = d.listNames(); + while (nameIt.hasNext()) { + graphURIs.add(nameIt.next()); + } + return graphURIs; + } finally { + dw.close(); + } + } } - return graphURIs; - } finally { - dw.close(); } + + return graphURIs; } @Override diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/sdb/RDFServiceSDB.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/sdb/RDFServiceSDB.java index 426c1ae34..3da53123d 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/sdb/RDFServiceSDB.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/sdb/RDFServiceSDB.java @@ -110,6 +110,7 @@ public class RDFServiceSDB extends RDFServiceJena implements RDFService { abortTransaction(sdbConn); throw new RDFServiceException(e); } finally { + rebuildGraphURICache = true; close(sdbConn); } } diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/tdb/RDFServiceTDB.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/tdb/RDFServiceTDB.java index 89843a11f..5533574e4 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/tdb/RDFServiceTDB.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/jena/tdb/RDFServiceTDB.java @@ -88,6 +88,8 @@ public class RDFServiceTDB extends RDFServiceJena { } catch (Exception e) { log.error(e, e); throw new RDFServiceException(e); + } finally { + rebuildGraphURICache = true; } } diff --git a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/sparql/RDFServiceSparql.java b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/sparql/RDFServiceSparql.java index a94144f2b..1451be017 100644 --- a/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/sparql/RDFServiceSparql.java +++ b/api/src/main/java/edu/cornell/mannlib/vitro/webapp/rdfservice/impl/sparql/RDFServiceSparql.java @@ -514,7 +514,7 @@ public class RDFServiceSparql extends RDFServiceImpl implements RDFService { } } - public void addModel(Model model, String graphURI) throws RDFServiceException { + private void addModel(Model model, String graphURI) throws RDFServiceException { try { long start = System.currentTimeMillis(); verbModel(model, graphURI, "INSERT"); @@ -524,7 +524,7 @@ public class RDFServiceSparql extends RDFServiceImpl implements RDFService { } } - public void deleteModel(Model model, String graphURI) throws RDFServiceException { + private void deleteModel(Model model, String graphURI) throws RDFServiceException { try { verbModel(model, graphURI, "DELETE"); } finally {