Chris,

It looks like details matter - could you send a complete, minimal example (i.e. standalone and runnable)?

Thanks

    Andy

On 28/02/18 17:26, Chris Wood wrote:
Yeh, I thought I was doing that! I've taken that line of code out anyway
but it seems to make no difference...

On 28 February 2018 at 16:55, Rob Vesse <[email protected]> wrote:

Notice that Andy specifically said in his response:

   call this very early (before any TDB related activity)

Rob

On 28/02/2018, 16:21, "Chris Wood" <[email protected]> wrote:

     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
     >     >>
     >     >>
     >
     >
     >
     >
     >
     >







Reply via email to