storeResouce 使用远程接口太慢

问题描述 投票:0回答:1

eXistDB 6.2.0

与使用嵌入式数据库相比,通过远程接口保存到本地运行的数据库要慢几个数量级。我不知道问题出在哪里,或者如何更有效地存储数据。

我需要存储大约100,000条记录。通过远程接口保存时,速度约为每秒100条记录。然而,当使用嵌入式数据库时,速度约为每秒 9,000 条记录。

我做错了什么,或者我该如何改进?

下面是一个代码示例。

远程 uri:xmldb:exist://localhost:8080/exist/xmlrpc 嵌入 uri: xmldb:exist://

在这两种情况下,数据库都在同一台机器上运行。附上db配置文件。

    final Random random = new Random();
    final HashMap<String, String> data = new HashMap<>();

    for (int i = 0; i < records; i++) {
        double latitude = MIN_LAT + (MAX_LAT - MIN_LAT) * random.nextDouble();
        double longitude = MIN_LON + (MAX_LON - MIN_LON) * random.nextDouble();

        String randomId = UUID.randomUUID().toString();
        String randomName = generateRandomString(random, 30);
        String randomValue = generateRandomString(random, 10);

        String resourceId = prefix + "/" + randomId;
        String xml = String.format(
                """
                        <entity>
                            <name>%s</name>
                            <value>%s</value>
                            <pos>%.8f %.8f</pos>
                        </entity>""",
                randomName, randomValue, latitude, longitude
        );
        data.put(resourceId, xml);
    }
    xmlDbService.saveEntity(data);
}

public void saveEntity(@NonNull HashMap<String, String> resources) throws Exception {
    var sortedResources = new TreeMap<>(resources);

    Collection col = null;
    String currentCollectionUri = null;
    long start = System.currentTimeMillis();

    int i = 0;
    int c = 0;
    try {
        for (var entry : sortedResources.entrySet()) {
            String resourceId = entry.getKey();
            String xmlData = entry.getValue();

            var param = splitResourceId(resourceId);
            String collectionUri = param[0];
            String resourceName = param[1];

            if (col == null || !collectionUri.equals(currentCollectionUri)) {
                if (col != null) {
                    col.close();
                }
                col = getOrCreateCollection(collectionUri);
                col.setProperty("indent", "no");
                currentCollectionUri = collectionUri;
            }

            i++;
            if (i % 1000 == 0) {
                long executionTime = System.currentTimeMillis() - start;
                log.info("Inserted: {}, rate {} / sec", i, c * 1000L / executionTime);
                start = System.currentTimeMillis();
                c = 0;
            }
            XMLResource res = (XMLResource) col.createResource(resourceName, XMLResource.RESOURCE_TYPE);
            res.setContent(xmlData);
            col.storeResource(res);
            c++;
            log.trace("Resource saved: {} in collection: {}", resourceName, currentCollectionUri);
        }
    } finally {
        if (col != null) {
            col.close();
        }
    }
} ```

<dependency>
    <groupId>org.exist-db</groupId>
    <artifactId>exist-core</artifactId>
    <version>6.2.0</version>
</dependency>

<dependency>
    <groupId>net.sf.xmldb-org</groupId>
    <artifactId>xmldb-api</artifactId>
    <version>1.7.0</version>
</dependency>
Thank you for your help and/or advice.

V.
java exist-db
1个回答
0
投票

@vlada 看起来您正在使用 XML:RPC 接口。由于您的 URI 表明您正在本地计算机上使用它,因此我们可能可以忽略任何网络性能问题。我怀疑性能成本来自于跨 XML:RPC 的文档的序列化/反序列化以及可能来自 XML:RPC 接口本身的实现。您可能需要考虑使用其他接口之一来查看性能是否有所提高,例如 WebDAV 或 REST 接口?

© www.soinside.com 2019 - 2024. All rights reserved.