gpt4 book ai didi

java - 存在数据库更新插入非常慢

转载 作者:行者123 更新时间:2023-12-02 06:48:08 25 4
gpt4 key购买 nike

我是exist-db的初学者。我正在通过 Java 构建 xml 文档。我通过JAXB处理数据,然后通过插入更新插入到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>

为了确保元素按正确的顺序放置,我使用以下代码进行插入更新,因此其类型的新记录要么是第一个记录,要么根据 id 附加在类似元素的末尾。

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();
}
}

对文档、地点等其他元素执行相同的方法。经过几次更新后,它变得非常慢。插入一条记录最多需要十秒。

只有我能找到的相关链接没有得到答复。

http://sourceforge.net/mailarchive/forum.php?thread_name=s2s508bb1471004190430h8b42ee99o3f1835a9bc873d58%40mail.gmail.com&forum_name=exist-development

http://exist.2174344.n4.nabble.com/Slow-xquery-quot-update-insert-quot-performance-tt4657541.html#none

最佳答案

一些想法:

  • 属性过滤器 ([@id=…]) 在大量节点上运行时可能会非常慢。请考虑,您发布的代码将要求 eXist 检查之前插入的每个作者的 @id,然后再找到插入新作者的正确位置。我可以想出几种方法来解决这个问题:
    1. @id 上的范围索引会大大加快速度。
    2. 使用@xml:id而不是@id可以让您使用id(…),这会更快。不过,这需要将您的 ID 更改为唯一(例如“author_1”和“portal_1”)
    3. 如果您确实总是递增 @id 值,则新节点将始终具有最大的 @id。在这种情况下,跟随//author[last()] 甚至 进入//agents 都可以正常工作。
  • 进行多次小插入总是比进行一次大插入慢。如果可能,请延迟将新数据保存到 eXist,直到您同时有大量数据要做。
  • 确保您正在创建的 XQueryService 在使用完毕后能够正确释放。 Utils.getXQueryService() 是否可能保留不应保留的引用?
  • 确保您不会增加不必要的开销。您可以在调用之间重用 XQueryService 吗?如果getAuthorByName()正在查询eXist,它可以与更新查询结合起来吗?您能否提供要通过变量绑定(bind)插入的节点,而不是作为查询中的文字,以便每次都可以重用相同的编译查询?

尽管如此,如果您只有 500 个节点,10 秒对于一次插入来说是非常长的时间。在我的机器上进行快速测试,使用未索引的“以下”语法在单个查询中运行一批更新,可以在一半时间内完成整个 500 次更新。很可能存在更大的问题,但您的问题中并不明显。

关于java - 存在数据库更新插入非常慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18372461/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com