我是一个使用exist-db的初学者。我正在通过Java构建一个xml文档。我通过JAXB处理数据,然后通过insert update将其插入到exist-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>为了确保元素按正确的顺序放置,我使用以下代码插入更新,因此它的类型的新记录要么是第一个记录,要么是附加在基于is的类似元素的末尾。
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();
}
}对于其他元素,如文档、place等,也会执行相同的方法。经过几次更新,它会变得非常慢。插入一个记录需要10秒的时间。
只有相关的链接,我可以找到,是未修改。
name=exist-development
http://exist.2174344.n4.nabble.com/Slow-xquery-quot-update-insert-quot-performance-tt4657541.html#none
发布于 2013-09-18 06:05:47
几点想法:
[@id=…])可能非常慢。请考虑发布的代码将要求eXist在找到插入新作者的正确位置之前检查每个先前插入的作者的@id。我可以想出几种方法来解决这个问题:@id的一个区间指数将大大加快速度。@xml:id而不是@id可以让您使用id(…),这会更快。这将需要更改您的身份证是唯一的,尽管(例如。"author_1“和"portal_1")@id值,那么新节点将始终拥有最大的@id。在这种情况下,following //author[last()]甚至into //agents都能正常工作。
XQueryService在处理完它们之后被正确地释放。Utils.getXQueryService()是否可能保留它不应该保留的引用?XQueryService吗?如果getAuthorByName()正在查询eXist,可以将其与更新查询结合起来吗?您能否提供通过变量绑定插入的节点,而不是查询中的文本,以便每次都可以重用相同的已编译查询?尽管如此,如果您只有500个节点,那么对于单个插入来说,10s是一个非常长的时间。在我的机器上使用using的“跟踪”语法在单个查询中运行一批更新的快速测试可以在一半的时间内完成整个500次。很可能有更大的错误,这在你的问题中并不明显。
https://stackoverflow.com/questions/18372461
复制相似问题