Hi Rob - sorry, that was an over-simplification of the psedocode; I do call
dataset.begin(ReadWrite.WRITE);
after initialising it.
I had also wondered if setFileMode makes any difference - I was using it
because of this Andy's comment here:
http://users.jena.apache.narkive.com/zUPFzLcm/tdb-shutdown-does-not-release-the-files
Chris
On 28 February 2018 at 14:54, Rob Vesse <[email protected]> wrote:
> Two things look odd:
>
> - You never call dataset.begin() to start the transaction yet you later
> try to commit() it
> - Calling SystemTDB.setFileMode() after opening a dataset probably doesn't
> have any effect on already open datasets though I could be wrong on this
> point
>
> Rob
>
> On 28/02/2018, 13:08, "Chris Wood" <[email protected]> wrote:
>
> Hi Andy,
>
> It's probably a bit more complicated than I originally suggested.
> Inside my
> try statement I do a bit of processing in a separate class (I create a
> new
> in-memory Dataset, and return the model from it, so I can add it to my
> my
> main dataset); but I also use this class to initialise the default
> model. I
> wonder if this is confusing the transaction...
>
> With a bit of pseudocode:
>
> Dataset dataset = TDBFactory.createDataset("path/to/tdb");
> Model model = new Processing(dataset).;
> SystemTDB.setFileMode(FileMode.direct);
>
> try {
> Model m = model.dataStructure();
> model.add(m);
> dataset.commit();
> } finally {
> dataset.close();
> }
>
> Processing.java:
>
> main:
> public Processing(Dataset dataset) {
> super(dataset.getDefaultModel().getGraph());
> }
>
> dataStructure():
> Dataset d1 = TDBFactory.createDataset();
> Model m1 = d1.getDefaultModel();
>
> // add stuff to m1 from an independent datasource
>
> return m1;
>
>
> On 28 February 2018 at 11:30, Andy Seaborne <[email protected]> wrote:
>
> > Chris,
> >
> > Is the dataset TDB (from TDBFactory) or a dataset holding a model,
> maybe
> > with added inference, where the base graph is backed by TDB?
> >
> > It is better to put changes to the dataset inside a transaction.
> Failing
> > that, it should be sync'ed -- TDB.sync().
> >
> > Andy
> >
> > http://jena.staging.apache.org/documentation/txn/
> >
> > On 27/02/18 18:33, Chris Wood wrote:
> >
> >> I've got a small application that follows the standard recommended
> >> pattern:
> >>
> >> // initialise dataset / model
> >> ...
> >> try {
> >> // ... add statements
> >> StmtIterator r = this.my_model.listStatements();
> >> System.out.println(r.toList().size());
> >> this.dataset.commit();
> >> } catch (SQLException e) {
> >> e.printStackTrace();
> >> } finally {
> >> this.dataset.close();
> >> }
> >>
> >> I was running this with Jena 3.0.1, and all was fine. I've just
> upgraded
> >> to
> >> 3.6.0. When I run the code and then check the tdb that is generated
> with
> >> (on Windows):
> >>
> >> tdbquery --loc="database" "SELECT (count(*) as ?t) where {?a
> ?b ?c
> >> . }"
> >>
> >> I get a NullPointerException:
> >>
> >> Exception
> >> java.lang.NullPointerException
> >> at
> >> org.apache.jena.tdb.transaction.JournalControl.replay(
> >> JournalControl.java:280)
> >> at
> >> org.apache.jena.tdb.transaction.JournalControl.recoverSegmen
> >> t(JournalControl.java:185)
> >> at
> >> org.apache.jena.tdb.transaction.JournalControl.recoverFromJo
> >> urnal(JournalControl.java:137)
> >> at
> >> org.apache.jena.tdb.StoreConnection.forceRecoverFromJournal(
> >> StoreConnection.java:150)
> >> at
> >> org.apache.jena.tdb.StoreConnection._makeAndCache(StoreConne
> >> ction.java:255)
> >> at
> >> org.apache.jena.tdb.StoreConnection.make(StoreConnection.java:214)
> >> at
> >> org.apache.jena.tdb.StoreConnection.make(StoreConnection.java:220)
> >> at
> >> org.apache.jena.tdb.transaction.DatasetGraphTransaction.<
> >> init>(DatasetGraphTransaction.java:70)
> >> at org.apache.jena.tdb.sys.TDBMaker._create(TDBMaker.
> java:55)
> >> at
> >> org.apache.jena.tdb.sys.TDBMaker.createDatasetGraphTransacti
> >> on(TDBMaker.java:42)
> >> at
> >> org.apache.jena.tdb.TDBFactory._createDatasetGraph(TDBFactory.
> java:89)
> >> at
> >> org.apache.jena.tdb.TDBFactory.createDatasetGraph(
> TDBFactory.java:71)
> >> at org.apache.jena.tdb.TDBFactory.createDataset(
> TDBFactory.
> >> java:55)
> >> at tdb.cmdline.ModTDBDataset.createDataset(ModTDBDataset.
> java:
> >> 103)
> >> at arq.cmdline.ModDataset.getDataset(ModDataset.java:36)
> >> at arq.query.getDataset(query.java:176)
> >> at arq.query.queryExec(query.java:213)
> >> at arq.query.exec(query.java:153)
> >> at jena.cmd.CmdMain.mainMethod(CmdMain.java:93)
> >> at jena.cmd.CmdMain.mainRun(CmdMain.java:58)
> >> at jena.cmd.CmdMain.mainRun(CmdMain.java:45)
> >> at tdb.tdbquery.main(tdbquery.java:33)
> >>
> >> What seems really weird is that if I run the code *again* (without
> >> deleting
> >> the dataset directory) the triplestore is populated.
> >>
> >> - If I run the code ensuring I use v3.0.1, this doesn't happen,
> and the
> >> tdbquery command works on the first attempt.
> >> - The print statement showing the number of statements in the
> dataset
> >> shows the correct number in all cases.
> >>
> >> What has changed between 3.0.1 and 3.6.0 to cause this (and any
> hints on
> >> what I need to do to resolve it would be greatly appreciated!)
> >>
> >> Thanks
> >> Chris
> >>
> >>
>
>
>
>
>
>