首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >exist-db更新插入非常慢

exist-db更新插入非常慢
EN

Stack Overflow用户
提问于 2013-08-22 05:42:01
回答 1查看 862关注 0票数 0

我是一个使用exist-db的初学者。我正在通过Java构建一个xml文档。我通过JAXB处理数据,然后通过insert update将其插入到exist-db资源中。我现在正在对大约500个节点进行测试,在执行了几十个节点之后,每次插入就需要10秒的时间。我的XML有以下一般结构。

代码语言:javascript
运行
复制
<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的类似元素的末尾。

代码语言:javascript
运行
复制
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

EN

回答 1

Stack Overflow用户

发布于 2013-09-18 06:05:47

几点想法:

  • 当在一大组节点上运行时,属性筛选器([@id=…])可能非常慢。请考虑发布的代码将要求eXist在找到插入新作者的正确位置之前检查每个先前插入的作者的@id。我可以想出几种方法来解决这个问题:
    1. @id的一个区间指数将大大加快速度。
    2. 使用@xml:id而不是@id可以让您使用id(…),这会更快。这将需要更改您的身份证是唯一的,尽管(例如。"author_1“和"portal_1")
    3. 如果您真的总是递增您的@id值,那么新节点将始终拥有最大的@id。在这种情况下,following //author[last()]甚至into //agents都能正常工作。

  • 做许多小的插入总是比做一个大的插入慢。如果可能的话,延迟将新数据保存到eXist,直到您一次有一大堆工作要做。
  • 确保您正在创建的XQueryService在处理完它们之后被正确地释放。Utils.getXQueryService()是否可能保留它不应该保留的引用?
  • 确保你没有不必要地增加开销。您能在调用之间重用XQueryService吗?如果getAuthorByName()正在查询eXist,可以将其与更新查询结合起来吗?您能否提供通过变量绑定插入的节点,而不是查询中的文本,以便每次都可以重用相同的已编译查询?

尽管如此,如果您只有500个节点,那么对于单个插入来说,10s是一个非常长的时间。在我的机器上使用using的“跟踪”语法在单个查询中运行一批更新的快速测试可以在一半的时间内完成整个500次。很可能有更大的错误,这在你的问题中并不明显。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18372461

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档