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