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