Java Jena TDB挂起/冻结命名模型访问

Java Jena TDB挂起/冻结命名模型访问,java,freeze,jena,Java,Freeze,Jena,我对Apache Jena TDB有问题。基本上,我创建了一个新的数据集,将数据从RDF/XML文件加载到名为http://example.com/model/filename“其中filename是XML/RDF文件的名称。加载数据后,命名模型中的所有语句都将插入到默认模型中。出于备份原因,命名模型保留在数据集中 当我现在尝试查询数据集中的命名模型时,TDB冻结,应用程序似乎在无限循环中运行,因此它不会终止,也不会引发异常 是什么导致了冻结,我如何才能防止冻结 示例代码: Dataset ds

我对Apache Jena TDB有问题。基本上,我创建了一个新的数据集,将数据从RDF/XML文件加载到名为http://example.com/model/filename“其中filename是XML/RDF文件的名称。加载数据后,命名模型中的所有语句都将插入到默认模型中。出于备份原因,命名模型保留在数据集中

当我现在尝试查询数据集中的命名模型时,TDB冻结,应用程序似乎在无限循环中运行,因此它不会终止,也不会引发异常

是什么导致了冻结,我如何才能防止冻结

示例代码:

Dataset ds = TDBFactory.createDataset("tdb");
Model mod = ds.getDefaultModel();

File f = new File("example.rdf");
FileInputStream fis = new FileInputStream(f);

ds.begin(ReadWrite.WRITE);

// Get a new named model to load the data into
Model nm = ds.getNamedModel("http://example.com/model/example.rdf");
nm.read(fis, null);

// Do some queries on the Model using the utility methods of Model, no SPARQL used

// Add all statements from the named model to the default model
mod.add(nm);

ds.commit();
ds.end();

// So far everything works as expected, but the following line causes the freeze
Iterator<String> it = ds.listNames();
数据集ds=TDBFactory.createDataset(“tdb”); Model mod=ds.getDefaultModel(); 文件f=新文件(“example.rdf”); FileInputStream fis=新的FileInputStream(f); 开始(读写写写); //获取新的命名模型以将数据加载到 型号nm=ds.getNamedModel(“http://example.com/model/example.rdf"); nm.read(fis,空); //使用模型的实用方法对模型进行一些查询,不使用SPARQL //将命名模型中的所有语句添加到默认模型 模加(nm); 提交(); ds.end(); //到目前为止,一切正常,但下面这行代码导致了冻结 迭代器it=ds.listNames(); 任何访问现有命名模型的方法调用都会导致相同的冻结反应,因此
getNamedModel(“http://example.com/model/example.rdf");例如。通过调用
getNamedModel(“http://example.com/model/example123.rdf");工作正常,因此只有对现有模型的访问被中断

使用环境:Linux 64位、Oracle Java 1.7.0_09、Jena 2.7.4(包括TDB 0.9.4)

提前感谢您的帮助

编辑:修复了代码片段中的错误

Edit2:解决方案(我对AndyS答案的最后一点评论)


好的,我检查了整个程序并添加了所有缺少的事务。它并没有像预期的那样工作。我怀疑Jena在我的程序的关闭序列中抛出了一个异常,但该异常没有正确报告,并且“冻结”是由其他线程没有正确终止引起的。感谢您指出错误的事务使用。

您能将此转换为测试用例并将其发送到jena用户邮件列表吗

您应该在事务内部获得默认模型-在事务外部获得它


此外,如果您以事务方式使用数据集,则不能像在
ds.listNames
中那样以非事务方式使用它。它不应该冻结-你应该得到某种警告。

很抱歉回复太晚,我不得不做一些其他事情。我目前正在修复代码中事务的使用,似乎我忘记了您指出的几个开始和结束。我做完后会汇报的。顺便说一句,新年快乐!好的,我检查了整个程序并添加了所有缺少的事务。它并没有像预期的那样工作。我怀疑Jena在我的程序的关闭序列中抛出了一个异常,但该异常没有正确报告,并且“冻结”是由其他线程没有正确终止引起的。感谢您指出错误的事务使用。