我是exists-db的初学者。我正在通过Java构建一个xml文档。我通过JAXB处理数据,然后通过插入更新插入到exists-db资源。我目前正在测试大约500个节点,并且在执行了几十个节点后,每个插件开始需要10秒钟。我的XML具有以下一般结构。
<realestatedata>
<agents>
<author id="1">
<name>Author_A</name>
</author>
<author id="2">
<name>Author_B</name>
</author>
<portal id="1">
<name>Portal_A</name>
</portal>
</agents>
<artifacts>
<document id="1">
<latitude>51.37392</latitude>
<longitude>-0.00866</longitude>
<bathroom_number>1</bathroom_number>
<bedroom_number>3</bedroom_number>
<price>365000</price>
</document>
<theme id="1">
<name>Garden</name>
</theme>
<place id="1">
<name>BR4</name>
<location>
<lat>51.37392</lat>
<lon>-0.00866</lon>
</location>
</place>
</artifacts>
</realestatedata>
为了确保元素按正确顺序放置,我使用以下代码进行插入更新,因此其类型的新记录要么是第一个,要么基于ids附加在类似元素的末尾。
public void saveAuthor(Author author) {
XQueryService xQueryService = null;
CompiledExpression compiled = null;
int currentId = authorIdSequence.get();
StringWriter authorXml = new StringWriter();
try {
xQueryService = Utils.getXQeuryService();
if (getAuthorByName(author.getName()) == null) {
author.setId(String.valueOf(authorIdSequence.incrementAndGet()));
marshaller.marshal(author, authorXml);
if(currentId == 0){
compiled = xQueryService
.compile("update insert " + authorXml.toString()
+ " into //agents");
}
else{
compiled = xQueryService
.compile("update insert " + authorXml.toString()
+ " following //author[@id = '"+String.valueOf(currentId)+"']");
}
xQueryService.execute(compiled);
}
} catch (XMLDBException e) {
e.printStackTrace();
} catch (JAXBException e) {
e.printStackTrace();
}
}
对文档,地点等其他元素执行相同的方法。经过一些更新后,它变得非常慢。它开始花费十秒钟来插入一条记录。
我找不到的相关链接都没有回复。
答案 0 :(得分:2)
一些想法:
[@id=…]
)可能会非常慢。考虑到您发布的代码将需要eXist检查每个先前插入的作者的@id
,然后才能找到插入新作者的正确位置。我可以想办法解决这个问题:
@id
上的范围索引会大大加快速度。@xml:id
代替@id
可以让您使用id(…)
,这会更快。这需要将您的ID更改为独特的(例如“author_1”和“portal_1”)@id
值,则新节点将始终具有最大@id
。在这种情况下,following //author[last()]
甚至into //agents
都可以正常使用。XQueryService
在完成后正确发布。 Utils.getXQueryService()
是否可能保留引用它不应该?XQueryService
吗?如果getAuthorByName()
正在查询eXist,是否可以将其与更新查询结合使用?您是否可以在查询中提供通过变量绑定而不是文字插入的节点,以便每次都可以重用相同的编译查询?尽管如此,如果您只有500个节点,10s对于单个插入来说是非常长的时间。在我的机器上使用未编制索引的“跟随”语法在单个查询中运行批量更新的快速测试可以在整个500个时间内完成整个500。在你的问题中,很可能出现更大的错误。