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

时间:2012-12-21 14:17:52

标签: java freeze jena

我遇到了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();

访问现有命名模型的任何方法调用都会导致相同的冻结反应,因此对于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在我的程序的关闭序列期间抛出异常,但是没有正确报告异常并且“冻结”是由其他未正确终止的线程引起的。感谢您指出错误的交易使用情况。

1 个答案:

答案 0 :(得分:1)

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

你应该在交易中获得默认模型 - 你在外面得到它。

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