Hi Andy,

I've moved the model.close() call inside the transaction (sorry for
this careless mistake) and it works now !

Thank you very much for your help.
Laurent



On 14 September 2016 at 18:28, Andy Seaborne <a...@apache.org> wrote:

> Hi Laurent,
>
> On 14/09/16 15:16, Laurent Rucquoy wrote:
>
>> Hi Andy,
>>
>> Thank you for your help.
>>
>> I have tested the following code according to your suggestions (get the
>> model inside the transaction and remove the use of locks):
>>
>> dataset.begin(ReadWrite.WRITE);
>>
>>> Model model = dataset.getNamedModel("http://my-model-name";);
>>> try {
>>>     UpdateAction.parseExecute(sparql, model);
>>>
>>
> What is the update?
>
>     if(writeMode) {
>>>         dataset.commit();
>>>     }
>>> } finally {
>>>
>>>     model.close();
>>>
>>
> You are using the model after the commit
>
>     dataset.end();
>>> }
>>>
>>
>>
>         Andy
>
>
>> When multiple updates are made on our TDB-backed dataset, the java.util.
>> ConcurrentModificationException is still thrown, leaving the dataset in
>> an
>>
>> inaccessible state.
>> Here is the stacktrace part:
>>
>> Caused by: java.util.ConcurrentModificationException: Iterator: started
>> at
>>
>>> 5, now 8
>>> at
>>> org.apache.jena.tdb.sys.DatasetControlMRSW.policyError(Datas
>>> etControlMRSW.java:157)
>>> at
>>> org.apache.jena.tdb.sys.DatasetControlMRSW.access$000(Datase
>>> tControlMRSW.java:32)
>>> at
>>> org.apache.jena.tdb.sys.DatasetControlMRSW$IteratorCheckNotC
>>> oncurrent.checkCourrentModification(DatasetControlMRSW.java:110)
>>> at
>>> org.apache.jena.tdb.sys.DatasetControlMRSW$IteratorCheckNotC
>>> oncurrent.hasNext(DatasetControlMRSW.java:118)
>>> at org.apache.jena.atlas.iterator.Iter$2.hasNext(Iter.java:265)
>>> at org.apache.jena.atlas.iterator.Iter.hasNext(Iter.java:870)
>>> at org.apache.jena.atlas.iterator.Iter$1.hasNext(Iter.java:192)
>>> at org.apache.jena.atlas.iterator.Iter.hasNext(Iter.java:870)
>>> at
>>> org.apache.jena.atlas.iterator.RepeatApplyIterator.hasNext(
>>> RepeatApplyIterator.java:58)
>>> at
>>> org.apache.jena.tdb.solver.SolverLib$IterAbortable.hasNext(
>>> SolverLib.java:195)
>>> at org.apache.jena.atlas.iterator.Iter$2.hasNext(Iter.java:265)
>>> at
>>> org.apache.jena.sparql.engine.iterator.QueryIterPlainWrapper
>>> .hasNextBinding(QueryIterPlainWrapper.java:53)
>>> at
>>> org.apache.jena.sparql.engine.iterator.QueryIteratorBase.has
>>> Next(QueryIteratorBase.java:111)
>>> at
>>> org.apache.jena.sparql.engine.iterator.QueryIterRepeatApply.
>>> makeNextStage(QueryIterRepeatApply.java:101)
>>> at
>>> org.apache.jena.sparql.engine.iterator.QueryIterRepeatApply.
>>> hasNextBinding(QueryIterRepeatApply.java:65)
>>> at
>>> org.apache.jena.sparql.engine.iterator.QueryIteratorBase.has
>>> Next(QueryIteratorBase.java:111)
>>> at org.apache.jena.atlas.iterator.Iter$2.hasNext(Iter.java:265)
>>> at
>>> org.apache.jena.atlas.iterator.RepeatApplyIterator.hasNext(
>>> RepeatApplyIterator.java:45)
>>> at
>>> org.apache.jena.tdb.solver.SolverLib$IterAbortable.hasNext(
>>> SolverLib.java:195)
>>> at org.apache.jena.atlas.iterator.Iter$2.hasNext(Iter.java:265)
>>> at
>>> org.apache.jena.sparql.engine.iterator.QueryIterPlainWrapper
>>> .hasNextBinding(QueryIterPlainWrapper.java:53)
>>> at
>>> org.apache.jena.sparql.engine.iterator.QueryIteratorBase.has
>>> Next(QueryIteratorBase.java:111)
>>> at org.apache.jena.atlas.iterator.Iter$2.hasNext(Iter.java:265)
>>> at
>>> org.apache.jena.atlas.iterator.RepeatApplyIterator.hasNext(
>>> RepeatApplyIterator.java:45)
>>> at
>>> org.apache.jena.tdb.solver.SolverLib$IterAbortable.hasNext(
>>> SolverLib.java:195)
>>> at org.apache.jena.atlas.iterator.Iter$2.hasNext(Iter.java:265)
>>> at
>>> org.apache.jena.sparql.engine.iterator.QueryIterPlainWrapper
>>> .hasNextBinding(QueryIterPlainWrapper.java:53)
>>> at
>>> org.apache.jena.sparql.engine.iterator.QueryIteratorBase.has
>>> Next(QueryIteratorBase.java:111)
>>> at
>>> org.apache.jena.sparql.engine.iterator.QueryIterConcat.hasNe
>>> xtBinding(QueryIterConcat.java:82)
>>> at
>>> org.apache.jena.sparql.engine.iterator.QueryIteratorBase.has
>>> Next(QueryIteratorBase.java:111)
>>> at
>>> org.apache.jena.sparql.engine.iterator.QueryIterRepeatApply.
>>> hasNextBinding(QueryIterRepeatApply.java:74)
>>> at
>>> org.apache.jena.sparql.engine.iterator.QueryIteratorBase.has
>>> Next(QueryIteratorBase.java:111)
>>> at
>>> org.apache.jena.sparql.engine.iterator.QueryIterConvert.hasN
>>> extBinding(QueryIterConvert.java:58)
>>> at
>>> org.apache.jena.sparql.engine.iterator.QueryIteratorBase.has
>>> Next(QueryIteratorBase.java:111)
>>> at
>>> org.apache.jena.sparql.engine.iterator.QueryIterDistinct.get
>>> InputNextUnseen(QueryIterDistinct.java:104)
>>> at
>>> org.apache.jena.sparql.engine.iterator.QueryIterDistinct.has
>>> NextBinding(QueryIterDistinct.java:70)
>>> at
>>> org.apache.jena.sparql.engine.iterator.QueryIteratorBase.has
>>> Next(QueryIteratorBase.java:111)
>>> at
>>> org.apache.jena.sparql.engine.iterator.QueryIteratorWrapper.
>>> hasNextBinding(QueryIteratorWrapper.java:39)
>>> at
>>> org.apache.jena.sparql.engine.iterator.QueryIteratorBase.has
>>> Next(QueryIteratorBase.java:111)
>>> at
>>> org.apache.jena.sparql.engine.iterator.QueryIteratorWrapper.
>>> hasNextBinding(QueryIteratorWrapper.java:39)
>>> at
>>> org.apache.jena.sparql.engine.iterator.QueryIteratorBase.has
>>> Next(QueryIteratorBase.java:111)
>>> at
>>> org.apache.jena.sparql.engine.ResultSetStream.hasNext(Result
>>> SetStream.java:74)
>>> at
>>> org.apache.jena.sparql.engine.ResultSetCheckCondition.hasNex
>>> t(ResultSetCheckCondition.java:59)
>>>
>>
>>
>>
>> Regards,
>> Laurent
>>
>>
>>
>> On 14 September 2016 at 11:36, Andy Seaborne <a...@apache.org> wrote:
>>
>> Hi Laurant,
>>>
>>> Try getting the model inside transaction, not passing it across
>>> transaction boundaries.
>>>
>>> dataset.begin(ReadWrite.WRITE);
>>> try {
>>>   Model model = dataset.get...
>>>   ...
>>>   dataset.commit() ;
>>> } ...
>>>
>>> In 3.1.0, the model is (sort of) connected to the transaction in which it
>>> is created.  This is fixed in the next release but style-wise, because
>>> model are just views of the database, they are related to transactions.
>>>
>>> No need to close the model but it's harmless to do so.
>>>
>>> You don't need the locking as well as transactions.
>>>
>>>         Andy
>>>
>>>
>>>
>>> On 14/09/16 08:59, Laurent Rucquoy wrote:
>>>
>>> Hello,
>>>>
>>>> We use a Jena TDB-backed dataset (release 3.1.0) accessed through a
>>>> single
>>>> JVM multi-threaded application running generally on a Microsoft Windows
>>>> server.
>>>>
>>>> The read and write accesses are made using transaction and read/write
>>>> locks.
>>>> Here is the SPARQL update code we use:
>>>>
>>>> dataset.begin(ReadWrite.WRITE);
>>>>
>>>> model.enterCriticalSection(Lock.WRITE);
>>>>> try {
>>>>>     UpdateAction.parseExecute(sparql, model);
>>>>>     if(writeMode) {
>>>>>         dataset.commit();
>>>>>     }
>>>>> } finally {
>>>>>     model.leaveCriticalSection();
>>>>>     model.close();
>>>>>     dataset.end();
>>>>> }
>>>>>
>>>>>
>>>>
>>>> Note that our SPARQL query code implements also read transactions and
>>>> locks.
>>>>
>>>> When multiple updates are made on our TDB-backed dataset, a
>>>> java.util.ConcurrentModificationException is sometimes thrown, leaving
>>>> the
>>>> dataset in an inaccessible state.
>>>> Here is the stacktrace part:
>>>>
>>>>
>>>> ...
>>>>
>>>>> Caused by: java.util.ConcurrentModificationException: Reader = 1,
>>>>> Writer =
>>>>> 1
>>>>> at
>>>>> org.apache.jena.tdb.sys.DatasetControlMRSW.policyError(Datas
>>>>> etControlMRSW.java:157)
>>>>> at
>>>>> org.apache.jena.tdb.sys.DatasetControlMRSW.policyError(Datas
>>>>> etControlMRSW.java:152)
>>>>> at
>>>>> org.apache.jena.tdb.sys.DatasetControlMRSW.checkConcurrency(
>>>>> DatasetControlMRSW.java:79)
>>>>> at
>>>>> org.apache.jena.tdb.sys.DatasetControlMRSW.startUpdate(Datas
>>>>> etControlMRSW.java:60)
>>>>> at
>>>>> org.apache.jena.tdb.store.nodetupletable.NodeTupleTableConcr
>>>>> ete.startWrite(NodeTupleTableConcrete.java:65)
>>>>> at
>>>>> org.apache.jena.tdb.store.nodetupletable.NodeTupleTableConcr
>>>>> ete.sync(NodeTupleTableConcrete.java:249)
>>>>>
>>>>>
>>>>
>>>> How can we avoid such a situation ?
>>>> Can we safely do without read/write locks when we use transactions in a
>>>> single JVM multi-threaded application ?
>>>>
>>>> Thank you in advance for your help.
>>>>
>>>> Sincerely,
>>>> Laurent
>>>>
>>>>
>>>>
>>

Reply via email to